0

以前にそのような質問があった場合は申し訳ありませんが、いくら検索しても見つかりませんでした(同様の質問がありましたが、どれも私には当てはまらなかったようです)。

テンプレート化されたクラスを作成していますが、operator+ をオーバーロードしようとする場合を除いて、すべて正常に動作します。異なるパラメーターに対して operator+ を 2 回オーバーロードしようとしましたが、コンパイラーは定義の 1 つを認識せず、エラーを返します。コードは次のとおりです。

Worker.h (以前の宿題の 1 つで、見やすいのでここで問題を実装しました):

#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 を使用) しか認識しないことです。また、一度だけオーバーロードしようとすると、両方とも単独で正常に動作するため、関数に問題はないようです。また、テンプレート化されていないクラスでそれらを (必要な変更を加えて) 使用することもできます。

簡単なことだと思いますが、テンプレートに慣れていないので、何が問題なのかわかりませんでした。

4

2 に答える 2

2

テンプレートとは関係なく、あなたのアプローチにはいくつかの問題があります。

最初に、演算子は 1 つの操作順序に対してのみ機能します:Worker<T> + intであり、そうではありません int + Worker<T>

2 つ目は、通常、またはを変更してはならないthisため、参照ではなく、新しい Worker インスタンスを返すことです。A+BAB

したがって、さまざまな順序で非メンバー演算子を定義することができます。

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

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

等々。

などのオブジェクトの状態に影響を与える必要がある演算子の場合、通常のアプローチはメンバー演算子を使用して参照によって返すことです。これらの場合、それは完全に理にかなっているからです。+=*=

于 2012-04-29T13:06:36.667 に答える
1

ここに 2 つのことがあり、そのうちの 1 つはあなたの問題です

メンバー関数の戻り値の型は、クラスがテンプレートであるという事実の影響を受けないため、戻り値の宣言とoperator+戻り値Workerの定義Worker<T>は異なります。クラス定義では、次のようにする必要があります。

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

Worker::上記のコードでも変更されているもう 1 つの点は、クラス宣言でスコープ ( ) が必要ないことです。

于 2012-04-29T13:06:12.190 に答える