2

この演算子のオーバーロードでエラーが発生します。これが私が得ているエラーです:

Angle.cpp:466:エラー:'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

ここで問題が発生します:

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

奇妙なことに、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() << "°";
}
4

1 に答える 1

1

これは、オーバーロードされた演算子<<でテンプレートを使用しているためですが、このオーバーロードはクラスにないため、タイプ名Tを設定できません。つまり、必要なすべてのタイプの変数に対して演算子<<をオーバーロードする必要があります。テンプレートでもあるクラスでこの演算子を使用またはオーバーロードします。例えば:

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

    return out;
}

このエラーは、コンパイラがそこで使用される変数の種類を予測できないことを意味します。


可能なすべてのデータに対してこの演算子をオーバーロードするため、doubleを返すgetDegrees()関数を渡すと、x.output(out);とは思われません。動作します;)(ヒントxは2倍になります)

于 2012-07-19T19:00:50.437 に答える