2010-09-11 85 views
4

何時可以省略C++模板參數列表?例如,在Visual Studio 2010中這一段代碼編譯罰款:省略C++模板參數列表時的區別

template<class T> 
Vec2<T> Vec2<T>::operator+ (const Vec2 &v) const 
{ 
    return Vec2(x + v.x, y + v.y); 
} 

如果內嵌代碼,它實際上編譯沒有任何參數列表。但這是否與以下版本一樣?

template<class T> 
Vec2<T> Vec2<T>::operator+ (const Vec2<T> &v) const 
{ 
    return Vec2<T>(x + v.x, y + v.y); 
} 

回答

4

內一類,你可以省略這個類的參數類型:

template<typename K> 
struct A { 
    A<K> foo1; // legal 
    A foo2; // also legal and identical to A<K> foo 
    A bar(A x) {...} // same as A<K> bar(A<K> x) {...} 
}; 

外,您所需要的模板參數類範圍:

// legal 
template<typename K> 
A<K> foo(A<K> x) { return A<K>(); } 

// illegal! 
template<typename K> 
A foo(A x) { return A(); } 

如果聲明成員功能外類您需要返回類型和類的模板列表:

// legal 
template<typename K> 
A<K> A<K>::bar(A<K> x) { return A<K>(x); } 

// legal 
template<typename K> 
A<K> A<K>::bar(A x) { return A(x); } 

// illegal! 
template<typename K> 
A A::bar(A<K> x) { return A<K>(x); } 
+1

好的,所以我猜想,即使第一個版本沒有在任何地方使用參數進行編譯,但在類的外部聲明/定義成員函數時,它可能是很好的風格。謝謝! – George 2010-09-11 10:03:30

+0

我錯過了一些東西。所以簡短的答案是:你的兩個版本是相同的。 – Danvil 2010-09-11 10:19:37

+0

我在搜索[cppreference.com](http://www.cppreference.com)的時候找到了這個問題/答案,但找不到任何答案。它只是沒有在該網站上提及,還是我忽略了它?特別是我對技術原因感興趣。例如:參數列表在實例化類的範圍內計算(因此'A' ='A '),但返回值不是。 (這感覺不一致,因爲兩者都構成了方法的簽名,不是嗎?) – 2015-07-19 07:22:31