2013-01-21 3 views
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; 
} 

Это НЕ работает. Может ли кто-нибудь указать, что я пропущу? Благодарю. Кроме того, это приводит к ошибке «C2593:« операция < < »является неоднозначной« везде »cout < <« некоторая строка »; используется.Перегрузка с общим выходом оператора C++

ответ

2

Вы создали выходной оператор, который может быть вызван для всех типов, когда это очевидно, что это должно быть только в состоянии быть использован для W и X классов. Вам нужно сузить область действия функции оператора вывода.

+0

Как ограничить область действия общей функции и шаблонов классов? –

+0

@KokHowTeh. Один из способов - создать общий базовый класс и иметь немодулированный оператор вывода для этого базового класса. Или у вас просто два оператора вывода, по одному для каждого класса. –

0

Компилятор может вывести шаблон из вызова. Так что, когда вы звоните os << "m_val1: ", основываясь на вашей реализации шаблона, он создает

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

ведьма уже существует. Дополнительная информация о выводе аргумента шаблона в http://accu.org/index.php/journals/409