专业化后的显式实例化

时间:2015-09-12 09:18:06

标签: c++ templates instantiation

#include <iostream>
using namespace std;

template <typename>
  class Test
{
  void fun() { cout << "test" << endl; } 
  void bar() { cout << "bar"; }
};


template<>
  class Test<int>
{
  void fun(){}
};

template void Test<int>::fun();

我收到了一个错误:

错误:template-id&#39; fun&lt;&gt;&#39; for&#39; void Test :: fun()&#39;与任何模板声明都不匹配

但为什么?

我知道如果在Test例如

中添加模板以获得乐趣
template<>
  class Test<int>
{
  template <typename>
  void fun(){}
};

template void Test<int>::fun<bool>();

对于功能模板

template<class T> void sort(Array<T>& v) { /*...*/ } // primary template

template<>  //explicit specialization of sort(Array<String>)
void sort<String>(Array<String>& v); // after implicit instantiation

template
void sort(Array<String>& v);// no matter before/after  void f(Array<String>& v) , it both works

void f(Array<String>& v) {
    sort(v); // implicitly instantiates sort(Array<String>&), 
}            // using the primary template for sort()

1 个答案:

答案 0 :(得分:3)

显式特化(即部分特化)不再是模板。这意味着它的所有成员都存在(就像它们被实例化一样),所以你不能(也不必)实例化它们。