C++ C++;模板类中的函数指针出现问题
我编写了一个简单的模板类,当我尝试启动它的一个方法时,它会给我带来一些问题 下面的(最小完成)示例显示了我的问题:我定义了一个模板类,其中包含在构造函数中设置的函数指针C++ C++;模板类中的函数指针出现问题,c++,visual-studio,templates,visual-studio-2017,c++17,C++,Visual Studio,Templates,Visual Studio 2017,C++17,我编写了一个简单的模板类,当我尝试启动它的一个方法时,它会给我带来一些问题 下面的(最小完成)示例显示了我的问题:我定义了一个模板类,其中包含在构造函数中设置的函数指针 #include <windows.h> template <class T1> class T1Class { public: typedef T1 ( *TCopyNodeData )(const T1& SrcData); T1Class ( TCopyNodeData
#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 &)'
#包括
模板类T1Class
{
公众:
typedef T1(*TCopyNodeData)(常数T1和SrcData);
T1Class(TCopyNodeData CopyNodeData)
{
//.....
}
};
无符号整数复制数据(常量无符号整数和IData)
{
//.....
返回0;
}
字符*复制数据(常量字符*和数据)
{
//.....
返回空ptr;
}
int APICENT wWinMain(_In_HINSTANCE HINSTANCE,_In_opt_HINSTANCE HPPreInstance,_In_LPWSTR lpCmdLine,_In_int nCmdShow)
{
T1Class MyT1Class1(CopyIData);//好的
T1Class MyT1Class2(副本数据);//****E0289,C2664
返回0;
}
//E0289构造函数“T1Class::T1Class[with T1=char*]”的实例与参数列表不匹配
//参数类型有:(char*(const char*&nda))
//C2664'T1Class::T1Class(T1Class&)':无法将参数1从'char*(\uu cdecl*)(const char*&)'转换为'char*(\uu cdecl*)(const T1&)'
现在,第一个构造函数(unsigned int)编译得很好,第二个构造函数(char*)编译得不好。我不理解错误信息;如果我在该消息中用char*替换T1,那么我有两个相同的参数类型,应该没有任何错误
还是我遗漏了什么
const unsigned int& IData
这里的IData
是对unsigned_int的常量引用
const char *& NData
这里的nda
是一个可变的引用,指向const char的指针
因此,您可以看到,上述内容在这方面并不等同,因此模板无法匹配
修复方法是移动常量
限定符:
char* CopySData (char * const& NData )
const
适用于T
的顶层,因此const T&==char*const&
当T=char*
时。请正确缩进您的代码您似乎缺少许多定义-您忘记了包含吗?是的,这就是诀窍,我对const了解了很多。谢谢。最后,我们有一个很好的理由选择T常量和x
而不是T常量和x
。