2012-04-29 15 views
0

このような質問が以前に尋ねられても、私はどれくらい検索してもわかりませんでした(同様の質問がありましたが、 )。テンプレートクラスの既存の定義に関数定義を一致させることができません

私はテンプレートクラスを作成していますが、演算子+をオーバーロードしようとする場合を除いてすべて正常に動作します。私は異なるパラメータのために演算子+ 2回オーバーロードしようとしますが、コンパイラは定義の1つを見ず、エラーを出します。ここでは、コードです:

Worker.h(参照する方が簡単ですので、私&過去の宿題の一つが、ここで問題を実装):

#ifndef _WORKER_H 
#define _WORKER_H 

#include <string> 
#include "Project.h" 

using namespace std; 

template <class T> 
class Worker { 

public: 
    Worker(const string &, Project &); 

    void Work(const int &); 
    const Worker & Worker::operator+(const int &); //Problem 
    const Worker & Worker::operator+(const string &); //Problem 

    string getName() const; 
    int getTime() const; 
private: 
    string myName; //The name of the worker 
    Project & myProject; 
    int myTime; //Variable to keep track of how much the worker worked. 
}; 

#include "Worker.cpp" 
#endif 

とWorker.cppの関連部分:

template <class T> 
const Worker<T> & Worker<T>::operator+(const int & add) 
{ 
    cout << add; 
    return *this; 
} 

template <class T> 
const Worker<T> & Worker<T>::operator+(const string & add) 
{ 
    cout << add; 
    return *this; 
} 

+演算子は現在何もしていませんが、問題はコンパイラが最初に宣言された関数(この場合はパラメータをintとします)だけを見ていることです。一度だけオーバーロードしようとすると、両方ともうまく動作するため、機能に問題はないようです。また、テンプレート化されていないクラスでそれらを使用することもできます(必要な変更を加えます)。

私はそれが何かシンプルだと思うが、私はテンプレートが初めてなので、問題の内容を理解できなかった。

あなたの問題である1そのうちここ

+1

手元の問題に必ずしも関連しているわけではなく、.cppファイルをヘッダーに含めないでください。cppファイル – Attila

+0

オペレータがどのようにクラスを使用しているか、コンパイラが提供するエラーについてのコードを提供できますか? – Attila

+0

@Attilaこれは本当に悪いことですが、使用する前にすべての関数のコードを含め、テンプレートを完全に定義しなければなりません。これは、関数コードが何とかヘッダーファイルに現れるはずであることを意味します。 典型的な方法は、インラインファイル、.inlを使用してこれを明確にすることです。 –

答えて

1

2のもの、メンバ関数の戻り値の型は、クラスがテンプレートであるという事実によって影響されない、したがってWorkerを返すoperator+の宣言とWorker<T>を返す定義異なっています。クラス定義では、彼らは次のようになります。

+0

それは...私の問題を解決しましたが、問題(私は実際にそれが最初の問題だと思っていましたが、それは本当に論理的でした)。それはコンパイルされますが、なぜWorker ::がテンプレート化されたクラスでこのような問題を引き起こすのですか? (テンプレート化されていないクラスでこれを使用していましたが、Worker :: operatorは問題を引き起こしませんでした9)。 – merterpam

2

const Worker<T> & operator+(const int &); //Problem 
const Worker<T> & operator+(const string &); //Problem 

また、上記のコードに変更され、他のものは、あなたが(Worker::)範囲を必要としないで、クラスの宣言にいくつかありますあなたのアプローチの問題は、テンプレートとは無関係です。

まずあなたのオペレーターが操作だけの1つの順序のために働くだろう:Worker<T> + int、およびないint + Worker<T>

セカンド一般的にあなたがいるので、参照することによりthisを返さない、新しいワーカーインスタンスを返すようにしたいでしょうA+Bは、AまたはBを変更しないでください。

だから何あなたができることは異なる順序付けのために非加盟の演算子を定義している:ように

template <typename T> 
Worker<T> operator+(int i, const Worker<T>& t) { } 

template <typename T> 
Worker<T> operator+(const Worker<T>& t, int i) { } 

と。 オブジェクトの状態に影響を与えなければならない事業者のためのような+=*=というように、通常のアプローチは、メンバー演算子を使用し、これらのケースでは、それは完璧な理にかなっているので、参照によって返すことであることを

注意。

+0

これを返す必要はないことを知っています。+オーバーロードの内容はもともとそのことではなく、 int + Workerは使用できません。これを実装するより良い方法はフリー関数ですが、代入のためにメンバ関数を実行する必要があります(ワーカー+ intのみが求められます)。 – merterpam

関連する問題