模板内部的C++函数指针

can*_*rem 1 c++ templates function-pointers

我有这个问题:

template<typename T> class Bubu
{
...
   int (*comparer)(const T t1, const T t2);
...
public:
   Bubu(int (*_comparer)(const T t1, const T t2))
   {
      comparer = _comparer;
   }
};
Run Code Online (Sandbox Code Playgroud)

在另一个文件中:

Bubu<char*> asd(strcmp);
Run Code Online (Sandbox Code Playgroud)

错误:

error C2664: 'Bubu<T>::Bubu(int (__cdecl *)(const T,const T))' : 
             cannot convert parameter 1 from 'int (__cdecl *)(const char *,
             const char *)' to 'int (__cdecl *)(const T,const T)'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么.编译器不应该看到"char*"而不是"T"吗?

编辑:Ideone.com准备好的代码:


int asdf(const char* a, const char* b)
{       return 0; }

template class Bubu
{
   int (*comparer)(const T t1, const T t2);
public:
   Bubu(int (*_comparer)(const T t1, const T t2))
   {
      comparer = _comparer;
   }
};

int main(int argc, char* argv[])
{
Bubu asd(asdf);
}

Run Code Online (Sandbox Code Playgroud)

CB *_*ley 9

如果Tchar*,const Tchar* const这是不一样的东西const char *.你需要:

 Bubu<const char*> asd(strcmp);
Run Code Online (Sandbox Code Playgroud)

对于函数签名,顶级const被忽略

int (*)( const char* const, const char* const );
Run Code Online (Sandbox Code Playgroud)

与...的类型相同

int (*)( const char*, const char* );
Run Code Online (Sandbox Code Playgroud)

所以你在额外的顶级const上没问题,虽然它不会让你获得更简单的东西int (*comparer)(T t1, T t2);.