4

下面的代码工作正常,一个简单的模板类,有一个定义和一个使用

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

如果我然后添加以下内容(在 main 之上,但在模板类 foo 的声明之后;)

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

我从 g++ 得到一个错误

第 19 行:错误:'std::string foo::what()' 的模板 ID 'what<>' 与任何模板声明都不匹配

这是一个显示错误的键盘: http: //codepad.org/4HVBn9oJ

我犯了什么明显的错误?或者这对于 c++ 模板是不可能的?定义所有内联方法(使用 template<> foo 的定义)有效吗?

再次感谢大家。

4

3 回答 3

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

你不需要那个template<>foo<char>特化后已经是一个完整的类型。

于 2011-04-18T12:29:31.737 回答
2

把它写成:

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

按预期工作。

于 2011-04-18T12:34:58.097 回答
0

如果我然后添加以下内容(在 main 之上,但在模板类 foo 的声明之前;)

在泛型类模板之后定义特化。

当编译器看到特化时,它首先需要知道这是一个特化的类模板。所以从逻辑上讲,特化应该出现泛型类模板之后。

于 2011-04-18T12:28:40.167 回答