У меня есть шаблон без шаблонов, в котором объявлена функция шаблонов-членов.
Он выглядит примерно так:
.hpp
class Foo
{
private:
std::string libFilename;
bool libLoaded;
bool libFunctionsLoaded;
HINSTANCE libHandle;
std::map<std::string, long long int> libFunctions;
public:
Foo(std::string libFilename);
~Foo(void);
template<typename FunctionPointerType>
FunctionPointerType getFunctionPtr(std::string functionName);
void addUnitTestBlock(UnitTestBlock& newGroup);
};
template<typename FunctionPointerType>
FunctionPointerType Foo::getFunctionPtr(std::string functionName)
{
return reinterpret_cast<FunctionPointerType>(this->libFunctions[functionName];);
}
В cpp реализованы другие функции. Ради того, чтобы сделать это читаемым, я не включаю его. В основном, эта реализация будет загружать кучу DLL-функций из библиотеки и помещать имена и адреса (полученные из GetProcAddress()) в карту, которую вы видите в классе Foo.
Этот код был проверен, и я могу вытащить адрес и направить его на указатель функции и использовать функцию просто отлично...
Однако внутри функции шаблона карта имеет размер = 0. По какой-то причине функция шаблона не может видеть правильный член класса, когда дело доходит до карты <>. Он видит правильные значения для libLoaded и libFunctionsLoaded. Кроме того, функция шаблона не вызывается до тех пор, пока не будет заполнена карта libFunctions.
Вот как структурирована основная структура, чтобы дать вам представление о шаблоне вызова:
//DLL Function pointer prototypes
typedef int (*TestFunction)(int,char);
//Loads the whole DLL and populates the member variables including the map...
Foo libraryLoader= Foo("library.dll");
TestFunction function = libraryLoader.getFunctionPtr<TestFunction>("testFunc");
if(function(2, 'a') == 99)
{
std::cout << "Pass" << std::endl;
}
else
{
std::cout << "Fail" << std::endl;
}
Это пройдет, если я избавлюсь от шаблона и просто сделаю бросок.
Моя цель состояла в том, чтобы удалить необходимость кастинга в части пользователей, и просто попросите их передать тип указателя функций и бросить его для них. Любые идеи о том, почему функция шаблона не может видеть std :: map, но он может видеть bool?
Проверьте свой конструктор по умолчанию, конструктор копирования и любые другие пользовательские конструкторы/функции перемещения/оператора, которые вы пишете/перегрузите. Убедитесь, что они делают то, что, по вашему мнению, они делают.
Шаблонные функции отлично работают в не-шаблонных классах. Данные, являющиеся неточными или отсутствующими, скорее всего являются копией.
Изменение: Как упоминается ниже, пожалуйста... Соблюдайте правило пяти. Это определенно главный момент.