Указатели функций C ++ внутри шаблонов - PullRequest
1 голос
/ 18 марта 2011

У меня есть эта проблема:

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

Ответы [ 4 ]

9 голосов
/ 18 марта 2011

Когда T равно char*, const T равно char* const, что не то же самое, что const char *. Вам нужно:

 Bubu<const char*> asd(strcmp);

Верхний уровень const игнорируется для сигнатур функций, поэтому

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

того же типа, что и

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

так что вы в порядке на дополнительном верхнем уровне const, хотя он ничего не выигрывает у простого int (*comparer)(T t1, T t2);.

3 голосов
/ 18 марта 2011

Если T специализируется как char*, const T означает char* const (т.е. неизменяемый указатель на изменяемый char), а не const char* == char const* (т.е. изменяемый указатель на неизменяемыйchar).

Bubu<const char*> asd(strcmp)

скомпилируется.

0 голосов
/ 18 марта 2011

Я думаю, что это то, что вы хотите:

#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;
}
0 голосов
/ 18 марта 2011

Не уверен, что это ваша проблема, но ваш * в объявлении указателя функции находится не в том месте (по крайней мере, по сравнению с тем, что я когда-либо видел). Вместо:

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

Должно быть:

int (*comparer)(const T t1, const T t2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...