2012-07-19 21 views
2

이 연산자 오버로드에 오류가 발생합니다.<< 연산자 오류

void Angle::output(std::ostream& out) const 
{ 
    out << getDegrees() << "°"; 
} 

이상하게도하지 일어나는 :

여기

Angle.cpp:466: error: ambiguous overload for 'operator<<' in '(+out)->std::basic_ostream<_Elem, _Traits>::operator<< [with _Elem = char, _Traits = std::char_traits](((const Angle*)this)->Angle:: getDegrees()) << "\37777777660"'

내 클래스는 문제는 여기에 일어나는 << 운영자

#ifndef OUTPUTOPS_H 
#define OUTPUTOPS_H 1 

#include <ostream> 
#include "BoolOut.h" 

// Prints the output of an object using cout. The object 
// must define the function output() 
template< class T > 
std::ostream& operator<<(std::ostream& out, const T& x) 
{ 
    x.output(out); 

    return out; 
} 

#endif // OUTPUTOPS_H 

를 오버로드하는 것입니다 : 여기에 내가지고있어 오류입니다 getDegrees()에서 문자열에서. 문자열을 "hello"와 같은 것으로 변경해 보았습니다. 단지 기호가 아니지만 동일한 오류가 발생했습니다. 여기

관련이없는 코드를 제외한 나머지 코드입니다 :

// Angle.h 

#include "OutputOps.h" 
// End user added include file section 

#include <vxWorks.h> 
#include <ostream> 

class Angle { 

public: 
    // Default constructor/destructor 
    ~Angle(); 

    // User-defined methods 
    // 
    // Default Constructor sets Angle to 0. 
    Angle(); 
    // 
    ... 
    // Returns the value of this Angle in degrees. 
    double getDegrees() const; 
    ... 
    // Prints the angle to the output stream as "x°" in degrees 
    void output(std::ostream& out) const; 

}; 

#endif // ANGLE_H 


// File Angle.cpp 

#include "MathUtility.h" 
#include <math.h> 
// End user added include file section 

#ifndef Angle_H 
#include "Angle.h" 
#endif 


Angle::~Angle() 
{ 
    // Start destructor user section 
    // End destructor user section 
} 

// 
// Default Constructor sets Angle to 0. 
Angle::Angle() : 
radians(0) 
{ 
} 

... 
// 
// Returns the value of this Angle in degrees. 
double Angle::getDegrees() const 
{ 
    return radians * DEGREES_PER_RADIAN; 
} 

// 
// Returns the value of this Angle in semicircles. 
... 

// 
// Prints the angle to the output stream as "x°" in degrees 
void Angle::output(std::ostream& out) const 
{ 
    out << getDegrees() << "°"; 
} 
+1

포함 된 ostream & operator << (ostream &, char *) 또는 ostream & operator << (ostream &, string &)가 없습니까? 이 경우 컴파일러는 포함 된 템플릿과 템플릿 ostream & operator << (ostream, T &) 중 하나를 선택할 수 없습니다. 둘 다 적용됩니다. –

+2

** all ** 유형에 대해'operator <<'를 정의합니다. 분명히 그것은'std :: string'과 같은 몇몇 타입을 위해 이미 정의 된'operator <<'와 충돌합니다. –

+0

설명해 주셔서 감사합니다. –

답변

1

당신이 당신의 과부하 운영자 < <에 템플릿을 사용하기 때문입니다,하지만 당신은 유형 이름 T를 설정할 수 있도록이 오버로드, 클래스에없는 즉, 템플릿 인 클래스에서이 연산자를 사용하거나 오버로드하려는 모든 유형의 변수에 대해 연산자 < <을 오버로드해야합니다. 예를 들면 다음과 같습니다.

std::ostream& operator<<(std::ostream& out, const Angle& x) 
{ 
    x.output(out); 

    return out; 
} 

이 오류는 컴파일러가 어떤 종류의 변수를 사용할 지 예측할 수 없음을 의미합니다.


당신은 당신이 getDegrees을 통과 할 때 그렇게 (이중 반환) 함수는 다음 내가 (교체 아웃)이 x.output을 생각하지 않는, 가능한 모든 데이터에 대해이 연산자를 오버로드;) (힌트 x는 double이됩니다)

+0

이 오버로드가 전달되는 여러 변수에 사용되기 때문에 템플릿을 사용하고있었습니다. 이 코드는 약간 업데이트되는 레거시 코드이기 때문에 이전에는 작동했지만 지금은 그렇지 않을 것입니다. –

+1

모든 가능한 데이터에 대해이 연산자를 오버로드하므로 getDegrees() 함수를 전달하면 double을 반환하므로 x.output (out);) (힌트 x는 double이됩니다.) – Blood