【问题标题】:C++ function pointers inside templates模板内的 C++ 函数指针
【发布时间】:2011-03-18 07:33:07
【问题描述】:

我有这个问题:

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;
   }
};

在另一个文件中:

Bubu<char*> asd(strcmp);

错误:

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)'

我不明白为什么。编译器不应该在那里看到“char*”而不是“T”吗?

编辑:Ideone.com-ready 代码:


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);
}

【问题讨论】:

  • 一定是错字:int (*comparer)()
  • 请整理一下!当我尝试编译它时,我遇到了大约五个不相关的错误。然后我放弃了。给我们一段代码,我们可以通过 ideone.com 发布!

标签: c++ templates function-pointers


【解决方案1】:

Tchar* 时,const Tchar* const,这与const char * 不同。你需要:

 Bubu<const char*> asd(strcmp);

函数签名忽略顶级常量,所以

int (*)( const char* const, const char* const );

类型相同
int (*)( const char*, const char* );

所以你可以使用额外的顶级 const,尽管它不会比更简单的 int (*comparer)(T t1, T t2); 获得任何好处。

【讨论】:

  • 你是对的!我因此感到非常高兴。但是,如果我想更改模板中的一些 T 会发生什么?因为 Bubu 的类型中有 const 关键字?
  • @cantrem:你有很多选择。您可以编写一个调用strcmp 但需要指向非const char 的指针的包装函数;你可以用字符类型而不是指针类型来模板你的类,并使用int (*)( const T*, const T* );您可以使用一些特征样式的元函数从T = char* 恢复char 并从那里制造const char*。这实际上取决于您的模板应该为什么提供灵活性以及它必须假设其参数。
  • 我选择了包装 strcmp 的快速且非常肮脏的解决方案……但既然这是一个学校项目,就应该这样!我想最好的解决方案是像普通人一样使用 std::string。
【解决方案2】:

如果T 被特化为char*const T 表示char* const(即指向可变char 的不可变指针),而不是const char* == char const*(即指向不可变的可变指针char)。

Bubu<const char*> asd(strcmp)

将编译。

【讨论】:

  • 是的,但问题是我需要可变字符。知道如何保持我的 Bubu 声明原样吗?
  • 用非 const char* 参数将 strcmp 包装成一个函数实在是太丑了!
【解决方案3】:

不确定这是否是您的问题,但您在函数指针声明中的* 位置错误(至少与我所见过的相比)。而不是:

int (comparer*)(const T t1, const T t2);

应该是:

int (*comparer)(const T t1, const T t2);

【讨论】:

  • 它是(至少现在,如果是帖子编辑前的错字,请见谅)
【解决方案4】:

我认为这是你想要的:

#include <cstring>
#include <iostream>

template<class T>
class Bubu {
public:
    typedef int (*Comparator)(T, T);

    Bubu(Comparator inComparator) : mComparator(inComparator) { }

    int compare(T a, T b)
    {
        return mComparator(a, b);
    }

private:
    Comparator mComparator;
};

int main() 
{
    Bubu<const char*> obj(strcmp);
    std::cout << obj.compare("one", "two") << std::endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多