C++ 模板类-成员函数专门化

C++ 模板类-成员函数专门化,c++,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 templ

下面是一个示例代码:

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;
}
模板
甲级
{
公众:
A(T):x(T){}
T getX();
私人:
tx;
};
模板
ta::getX()
{
返回x;
}
//成员功能专门化
模板//可与模板一起使用,也可不使用模板
长A::getX()
{
返回1000L;
}
上述代码在成员函数专门化之前使用和不使用模板。为什么? 在这种情况下有什么区别

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

a1(1);

不能不遵守,它不遵守。

FWIW

您的编译器要么有缺陷,要么有一个扩展来支持这一点;我可以确认MSVS 2012接受该代码。我听说MSVS2013年11月CTP也毫无怨言地把它吃掉了。公平地说,VisualStudio对模板规范总是相当宽容的

[C++11:14.7/3]:
可以为函数模板、类模板、类模板的成员或成员模板声明显式专门化显式专门化声明由
模板引入

这条规则的唯一例外是:

[C++11:14.7.3/5]:
[…]显式专用类模板的成员是 以与普通类成员相同的方式定义,并且不使用
模板
语法。[……]


…但这不适用于此处。

您使用的编译器版本是什么?如果没有特定的调用,将不会生成模板,您可以粘贴用于调用此模板函数的代码吗?如果在该声明之前有明确的
A
专门化,则不得使用
模板
。否则,您必须使用它。很好,不是吗?“你的编译器要么有缺陷,要么有一个扩展来支持这个“为什么”或“?”?如果它至少没有发出警告,那么它就是有缺陷的,并且它有一个扩展名,因为程序没有被拒绝。@DyP:它可能有缺陷,而不是扩展名。@DyP:我讨厌这种情况发生
A<int> a1(1);
cout<<a1.getX()<<endl;
A<long> a2(1);
cout<<a2.getX()<<endl;