簡體   English   中英

模板類 - 成員函數特化

[英]template class - member function specialization

這是一個示例代碼:

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;
}

上面的代碼在成員函數特化之前使用和不使用模板<> 為什么? 在這種情況下有什么區別?

Edit1:我以這種方式使用該模板(VS 2012 編譯器):

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

不合規,不合規。

FWIW, GCC 4.8 拒絕沒有template <>代碼。

你的編譯器要么有問題,要么有擴展支持; 我可以確認 MSVS 2012 接受代碼。 我聽說 MSVS 2013 年 11 月 CTP 也毫無怨言地吃掉了它。 公平地說,Visual Studio 對模板規范總是相當寬容。

[C++11: 14.7/3]:可以為函數模板、類模板、類模板的成員或成員模板聲明顯式特化。 template<>引入了顯式特化聲明。 [..]

此規則的唯一例外是:

[C++11: 14.7.3/5]: [..]顯式專用類模板的成員以與普通類成員相同的方式定義,並且不使用template<>語法。 [..]

……但這不適用於這里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM