специализация шаблона функции c ++ - PullRequest
9 голосов
/ 12 октября 2011

Учитывая этот код:

class X
{
public:
    template< typename T >
    void func( const T & v );
};

template<>
void X::func< int >( const int & v )
{
}

template<>
void X::func< char * >( const char * & v )       // 16
{
}

При компиляции я получаю следующую ошибку.

test.cpp:16: error: template-id 'func<char*>' for 'void X::func(const char*&)' does not match any template declaration

Кто-нибудь может пролить свет на это?

Ответы [ 3 ]

7 голосов
/ 12 октября 2011

Если вы измените объявление:

template<> void X::func< char * >( const char * & v )

до:

template<> void X::func< char * >( char * const & v )

Это будет прекрасно работать. Почему это происходит? Поскольку const sometype вполне приемлемо, это всего лишь альтернативная запись для sometype const. Таким образом, ваш модификатор const применяется не к базовому типу (char), а к указателю, что делает «постоянный указатель на непостоянный символ» допустимым типом. Если это не то, что вам нужно, вам придется исправить базовый шаблон.

Наконец, вот вам интересное прочтение о , почему перегрузка шаблонов обычно лучше, чем их специализация .

4 голосов
/ 12 октября 2011

Причиной возникновения этой ошибки является то, что вы пишете const перед типом.Хотя это обычная практика, она не способствует пониманию того, как работают const / volatile-qualifiers (cv-qualifier).

В этом случае const T, когда T равно char*, не означает const char*.Это скорее означает char* const, потому что T равно char* и независимо от того, какую сторону T вы поставите const, оно ведет себя так, как если бы const находилось справа от T, то есть сам указательэто также будет const, а не тип, на который указывают.

Этот тип путаницы легко избежать, если вы сделаете правилом всегда ставить const или volatile справа от типа.Например, это упрощает умственное расширение T const, когда T равно char* до char* const.

Это причина, по которой в источниках буста вы видите cv-квалификаторы после типа, а не до.

4 голосов
/ 12 октября 2011

Ход const до &

template<> 
void X::func< char * >( char * const & v ) 
{ 
} 
...