【问题标题】:C++ Problem with Function Pointer in Template Class模板类中函数指针的 C++ 问题
【发布时间】: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&amp; == char* const&amp;T=char*
  • 请正确缩进您的代码
  • 您似乎遗漏了许多定义 - 您忘记包含了吗?

标签: c++ visual-studio templates visual-studio-2017 c++17


【解决方案1】:
const unsigned int& IData

这里 IData 是对 unsigned_int 的 const 引用

const char *& NData

这里的NData 是一个可变对指向 const char 的指针的引用。

所以你可以看到上面在这方面是不等价的,所以模板不能匹配。

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

char* CopySData (char * const& NData )

【讨论】:

  • 是的,这成功了,而且我学到了很多关于 const 的知识。谢谢。
  • 终于有充分理由更喜欢T const&amp;x 而不是const T&amp;x
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 2014-09-04
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2016-10-18
  • 2021-06-22
  • 1970-01-01
相关资源
最近更新 更多