我有一个非模板化的类,其中声明了模板化成员函数。
看起来类似于以下内容:
.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.由于某种原因,当涉及到地图&lt;&gt;时,模板函数无法看到正确的类成员。它确实看到了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的任何想法?
答案 0 :(得分:0)
检查您的默认构造函数,复制构造函数以及您编写/重载的任何其他自定义构造函数/ move / operator函数。确保这些正在做你认为他们正在做的事情。
模板化函数在非模板化类中工作得很好。数据不准确或丢失很可能是复制问题。
编辑:正如pmr在下面提到的那样......遵守五条规则。这绝对是重点。