1

というクラスがありTimeます。int hoursプライベート メンバーはとの 2 つだけint minutesです。public アクセス指定子には、加算、減算などの関数のみが含まれます。

しかし、私が望むように動作しない特定の機能があります。publicクラスで宣言されています。

このようにコンパイルします:

Time Time::operator*(const int &mult)
{
   minutes = minutes*mult;
   hours = hours*mult + minutes/60;
   minutes %= 60;
   return *this;
}

しかし、引数が naintではなくfloat、またはの場合はどうなるdoubleでしょうか。関数をオーバーロードするよりも、テンプレートを使用するのが最良のオプションだと思います。

template <class T> Time Time::operator*(const T &mult)
{
   minutes = int(minutes*mult);
   hours = int(hours*mult) + minutes/60;
   minutes %= 60;
   return *this;
}

ただし、このように記述するとコンパイル エラーが発生します。

error LNK2019: unresolved external symbol "public: class Time __thiscall Time::operator*<int>(int const &) " (??$?DH@Time@@QBE?AV0@ABH@Z) referenced in function _main

テンプレートで演算子のオーバーロードを使用できないことを意味しますか?

ありがとう
ロバート

4

1 に答える 1

0

テンプレートは関数のパターンのようなものです。それらは、使用する前にインスタンス化する必要があります。あなたの例では、 T=int を使用した Time::operator* のインスタンス化が必要です。これは、関数内の各 T を に置き換えることによって取得されますint

このインスタンス化には、次の 2 つの方法があります。

まず、明示的なインスタンス化があり、使用するすべての型のテンプレートをインスタンス化する必要があります。T=int の operator* の明示的なインスタンス化は次のようになります。

template Time Time::operator*<int>(const int &mult);

コンパイラはテンプレートをインスタンス化するために定義を確認する必要があるため、ここではテンプレート化された関数の実装は同じファイルまたはインクルード ファイルにある必要がありますが、明示的なインスタンス化をテンプレートの実装と一緒に実装ファイルに入れることができます。

もう 1 つの方法は暗黙的なインスタンス化です。テンプレートは、使用時に呼び出し側でインスタンス化されます。このメソッドでは、テンプレートの使用時にテンプレートの実装が表示されている必要があります。これを実現する最も簡単な方法は、テンプレートが宣言されているヘッダー ファイルにテンプレートの実装を配置することです。

したがって、int の明示的なインスタンス化を実装ファイルに追加するか、テンプレート実装をヘッダー ファイルに移動するかの 2 つの選択肢があります。

于 2013-07-04T14:28:06.010 に答える