模板类 - 成员函数专业化

时间:2013-12-28 17:34:41

标签: c++

以下是一个示例代码:

template<class T>
class A
{
public:
   A(T t): x(t){}
   T getX();
private:
   T x;
};

template<class T>
T A<T>::getX()
{
   return x;
}

// member function specialization
template<> // works with and without template<> 
long A<long>::getX()
{
   return 1000L;
}

上述代码在成员函数专门化之前使用和不使用模板&lt;&gt; 。为什么? 在这种情况下它有什么区别?

EDIT1: 我以这种方式使用该模板(VS 2012编译器):

A<int> a1(1);
cout<<a1.getX()<<endl;
A<long> a2(1);
cout<<a2.getX()<<endl;

1 个答案:

答案 0 :(得分:5)

不顺从,但事实并非如此。

FWIW,GCC 4.8 rejects your code without the template <>.

你的编译器有错误或有扩展支持这个;我可以确认MSVS 2012接受了该代码。我被告知MSVS 2013年11月CTP也没有抱怨就吃掉它。公平地说,Visual Studio对模板规范总是相当宽松。

  

[C++11: 14.7/3]: 可以声明功能模板,类模板,类模板的成员或成员模板的显式特化。 template<>引入了明确的专业化声明。 [..]

此规则的唯一例外是:

  

[C++11: 14.7.3/5]: [..] 明确专门的类模板的成员是   以与普通类成员相同的方式定义,而不是使用template<>语法。 [..]

......但这不适用于此。