2016-01-31 32 views
1

我想傳遞一個對象作爲重載運算符+的參數(並且該類是模板類),但它給了我一個錯誤,指出:傳遞一個對象作爲重載運算符的參數+模板類

error C2955: 'Kvader': use of class template requires template argument list 

這是我的類:

template <class Q> 
class Kvader { 
private: 
    Q a, b, c; 
public: 
    Kvader(const Kvader &temp); 
    Kvader operator+(Kvader); 
}; 

,這是我的重載+方法:

template <class Q> 
Kvader Kvader<Q>::operator+(Kvader<int> temp) { 
a += temp.a; 
b += temp.b; 
c += temp.c; 
return *this; 
} 

我以爲

Kvader Kvader<Q>::operator+(Kvader<int> temp) 

就足夠作爲參數列表。我究竟做錯了什麼?

在我的主要我只是做2個對象,(第二個調用複製構造函數),然後我嘗試將它們加在一起。

int main(){ 
Kvader<int> object1, object2(object1); 
object1 = object1 + object2; 

return 0; 
} 
+0

您需要在返回類型的模板參數。作爲一個猜測,'Kvader Kvader :: operator +(Kvader temp)...' –

+0

'operator +'中的參數應該是'const',它的返回類型應該是這樣的參考:'Kvader &Kvader : :operator +(const Kvader &temp)'。另外,你可以混合使用(用於'int's)和defininig模板。 – Patryk

+0

@Patryk'operator + ='應該返回一個引用,而不是'operator +'。 –

回答

1

該代碼包含了一些錯誤:

1)Kvader<Q> Kvader<Q>::operator+(Kvader<int> temp)

你需要指定返回類型以及參數列表。

2)Kvader<Q> operator+(Kvader<int>);

同1)+改變的參數類型來代替Kvader<int>的一般Kvader<Q>

3)Kvader<Q>(const Kvader<Q> &temp);

同1)。

4)指定Kvader<Q>的默認構造函數,否則main()中的創建語句將失敗。

5)此外,operator+(const T&)應返回一個引用,以允許運算符鏈接。它通常也需要一個const引用來避免不必要的複製。 6)最後,除非你有這樣做的特殊原因,否則像operator+(const Kvader<Q>&)這樣的東西應該首先以通用的方式定義,然後在有需要時進行專門的定義。你寫的方式,operator+(cont Kvader<int>&)只適用於那些Q類型的this對象可以添加到int的類型。你可能想要實現的目標是使Kvader專業化,並將具有相同確切參數的任何特定參數添加到Kvader中。然後,您可以爲特定的Q類型創建專業化,例如int

我建議你真正閱讀類和功能模板!事實上,它們有時會令人困惑。

完整代碼:

template <class Q> 
class Kvader { 
private: 
    Q a, b, c; 
public: 
    Kvader() {} 
    Kvader(const Kvader<Q> &temp); 
    Kvader& operator+(const Kvader<Q>& temp); 
}; 

template <class Q> 
Kvader<Q>& Kvader<Q>::operator+(const Kvader<Q>& temp) { 
a += temp.a; 
b += temp.b; 
c += temp.c; 
return *this; 
} 

template<class Q> 
Kvader<Q>::Kvader(const Kvader<Q> &temp) 
{} 

int main(){ 
Kvader<int> object1, object2(object1); 
object1 = object1 + object2; 

return 0; 
} 
+0

非常感謝! – Clg

+0

''在class Kvader {...}中是不需要的'',它是隱含的。 –

+0

我不是專家,根本不是,但cpp.sh,它使用gcc 4.9作爲後端,接受該代碼。謝謝你的提示!我會檢查Josuttis的書。 – iksemyonov

相關問題