Определение метода специализации шаблонов c ++ - PullRequest
4 голосов
/ 18 апреля 2011

Следующий код работает нормально, простой шаблонный класс с определением и использованием

#include <string>
#include <iostream>
using namespace std;

template<class T> class foo{
  public:
  string what();
};

template<class T> string foo<T>::what(){
  return "foo of type T";
}

int main(){
  foo<int> f;
  cout << f.what() << endl;
}

Если я добавлю следующее (выше основного, но после объявления шаблона класса foo;)

template<> class foo<char>{
public:
  string what();
};
template<> string foo<char>::what(){
  return "foo of type char";
}

Я получаю ошибку от g ++

Строка 19: ошибка: идентификатор шаблона 'что <>' для 'std :: string foo :: what ()' не соответствует ни одному шаблону декларация

Вот кодовая панель, показывающая ошибку: http://codepad.org/4HVBn9oJ

Какую очевидную ошибку я совершаю? Или это невозможно с шаблонами c ++? Будет ли работать определение всех встроенных методов (с определением шаблона <> foo)?

Еще раз спасибо всем.

Ответы [ 3 ]

8 голосов
/ 18 апреля 2011
template<> class foo<char>{
public:
  string what();
};
/*template<>*/ string foo<char>::what(){
  return "foo of type char";
}

Вам это не нужно template<>.foo<char> уже полный тип после того, как он специализирован.

2 голосов
/ 18 апреля 2011

Запись этого как:

#include <string>
#include <iostream>
using namespace std;

template<class T> class foo{
  public:
  string what();
};

template<class T> string foo<T>::what(){
  return "foo of type T";
}

template<> class foo<char>{
public:
  string what();
};

string foo<char>::what(){
  return "foo of type char";
}

int main(){
  foo<char> f;
  cout << f.what() << endl;
}

работает как ожидалось.

0 голосов
/ 18 апреля 2011

Если я добавлю следующее (выше основного, но до объявления класса шаблона foo;)

Определите специализацию после шаблона универсального класса.

К тому времени, когда компилятор видит специализацию, он должен сначала знать шаблон класса, специализацией которого он является.Логично, что специализация должна появиться после универсального шаблона класса.

...