現在、「Effective C++」を読んでいますが、これに似たコードを含む章があります。
template <typename T>
class Num {
public:
Num(int n) { ... }
};
template <typename T>
Num<T> operator*(const Num<T>& lhs, const Num<T>& rhs) { ... }
Num<int> n = 5 * Num<int>(10);
この本は、コンパイラが暗黙的な型キャストを使用してテンプレートを特殊化することを期待できないため、これは機能しない (そして実際に機能しない) と述べています。
解決策として、「friend」構文を使用してクラス内で関数を定義することをお勧めします。
//It works
template <typename T>
class Num {
public:
Num(int n) { ... }
friend
Num operator*(const Num& lhs, const Num& rhs) { ... }
};
Num<int> n = 5 * Num<int>(10);
そして、この本は、テンプレート クラス型への暗黙的な変換が必要なときはいつでも、このフレンド宣言を使用することを提案しています。そして、それはすべて理にかなっているようです。
しかし、演算子ではなく、共通の関数で同じ例を使用できないのはなぜでしょうか?
template <typename T>
class Num {
public:
Num(int n) { ... }
friend
void doFoo(const Num& lhs) { ... }
};
doFoo(5);
今回は、コンパイラは「doFoo」がまったく見つからないという不平を言っています。そして、クラス外で doFoo を宣言すると、合理的なタイプの不一致エラーが発生します。「友達…」の部分が無視されているようです。
私の理解に問題はありますか?この場合、関数と演算子の違いは何ですか?