模板类中函数指针的C ++问题

时间:2018-10-18 16:51:50

标签: 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 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 &)'

现在,第一个构造函数(无符号int)可以正常编译,而第二个构造函数(char *)则可以。我不明白该错误信息;如果我在该消息中用char *替换T1,则我确实具有两个相同的参数类型,并且应该没错。

或者-我想念什么吗?

1 个答案:

答案 0 :(得分:2)

const unsigned int& IData

此处IData是对unsigned_int的const引用

const char *& NData

此处NData是对指向const char的指针的可变引用。

因此您可以看到上述内容在这方面并不相同,因此模板无法匹配。

解决方法是移动const限定词:

char* CopySData (char * const& NData )