36

我正在阅读模板的完整指南,它说以下内容:

它在哪里谈论类模板专业化。

尽管可以特化类模板的单个成员函数,但一旦这样做,就不能再特化该特化成员所属的整个类模板实例。

我实际上想知道这是怎么回事,因为您可以在没有任何成员函数的情况下进行专业化。是不是说你不能有一个只有一个成员函数的特化,然后另一个有所有成员函数的特化?

有人可以澄清一下吗?

4

2 回答 2

38

我认为它指的是以下案例:

template <typename T>
struct base {
   void foo() { std::cout << "generic" << std::endl; }
   void bar() { std::cout << "bar" << std::endl; }
};
template <>
void base<int>::foo() // specialize only one member
{ 
   std::cout << "int" << std::endl; 
}
int main() {
   base<int> i;
   i.foo();         // int
   i.bar();         // bar
}

一旦完成,您就不能将完整的模板专门化为任何其他东西,所以

template <>
struct base<int> {};  // error
于 2011-05-10T12:50:54.183 回答
3

我认为这意味着您可以:

  • 专门化整个类和所有成员(数据和函数,静态与否,虚拟与否)必须声明和定义,即使它们与非专门化版本相同,

  • 特化一些函数成员,但是你不能特化整个类(即所有成员的声明方式与非特化情况相同,你只需提供一些函数成员的实现)。

于 2011-05-10T12:50:09.510 回答