【发布时间】:2019-03-23 13:16:27
【问题描述】:
我编写了一个简单的模板类,当我尝试启动其中一个方法时,它给我带来了一些问题。
下面的(最小完整)示例显示了我的问题:我定义了一个模板类,其中包含一个在构造函数中设置的函数指针。
#include <windows.h>
template <class T1> class T1Class
{
public:
typedef T1 ( *TCopyNodeData )(const T1& SrcData);
T1Class ( TCopyNodeData CopyNodeData )
{
//.....
}
};
unsigned int CopyIData ( const unsigned int& IData )
{
//.....
return 0;
}
char* CopySData ( const char*& NData )
{
//.....
return nullptr;
}
int APIENTRY wWinMain ( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow )
{
T1Class<unsigned int> MyT1Class1 ( CopyIData ); // ok
T1Class<char*> MyT1Class2 ( CopySData ); // ***** E0289, C2664
return 0;
}
// E0289 no instance of constructor "T1Class<T1>::T1Class [with T1=char *]" matches the argument list
// argument types are : (char *(const char *&NData))
// C2664 'T1Class<char *>::T1Class(T1Class<char *> &&)' : cannot convert argument 1 from 'char *(__cdecl *)(const char *&)' to 'char *(__cdecl *)(const T1 &)'
现在,第一个构造函数 (unsigned int) 可以正常编译,而第二个 (char*) 则不行。我不明白错误信息;如果我在那条消息中用 char* 替换 T1,我确实有两个相同的参数类型,应该没有错。
或者——我错过了什么?
【问题讨论】:
-
const适用于T的顶层,所以const T& == char* const&时T=char*。 -
请正确缩进您的代码
-
您似乎遗漏了许多定义 - 您忘记包含了吗?
标签: c++ visual-studio templates visual-studio-2017 c++17