Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板类中的函数指针出现问题_C++_Visual Studio_Templates_Visual Studio 2017_C++17 - Fatal编程技术网

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