以下是一个示例代码:
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;
答案 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<>
语法。 [..]
......但这不适用于此。