1
class W
{
private:
    long m_val1, m_val2;
public:
    W(long& val1, long& val2):m_val1(val1), m_val2(val2) {}
    template<class T>
    friend std::ostream& operator<<(std::ostream& os, const T& w);
};

class X
{
private:
    long m_val1, m_val2;
public:
    X(const long& val1, long& val2):m_val1(val1), m_val2(val2) {}
    template<class T>
    friend std::ostream& operator<<(std::ostream& os, const T& x);
};

template<class T>
std::ostream& operator<<(std::ostream& os, const T& obj)
{
    os << "m_val1: " << obj.m_val1 << ", m_val2: " << obj.m_val2 << endl;
}

それは動作しません。誰かが私が見逃していることを指摘できますか? ありがとう。さらに、これにより、「cout << "some string";」のどこでも「エラー C2593: 'operation <<' is ambiguous」が発生します。使用されている。

4

2 に答える 2

2

すべての型に対して呼び出すことができる出力演算子を作成しましたが、これは明らかにWandXクラスに対してのみ使用できるはずです。出力演算子関数の範囲を狭める必要があります。

于 2013-01-21T11:16:15.067 に答える
0

コンパイラは、呼び出しからテンプレートを推測できます。したがってos << "m_val1: "、テンプレートの実装に基づいて を呼び出すと、作成されます

template<class T>
std::ostream& operator<<(std::ostream& os, const string& obj)

魔女はすでに存在します。http://accu.org/index.php/journals/409のテンプレート引数控除に関する詳細情報

于 2013-01-21T11:27:00.587 に答える