2013-05-01 15 views
7

VS 2012でVisual Studioネイティブユニットテストを使用すると奇妙な問題が発生しました。 I've a Coordinatesそのようなクラス:私が使用している場合VS2012:ユニットテストでエラーが発生しました:Assert :: AreEqual(オブジェクト、オブジェクト)が機能しませんでした

#ifndef COORDINATES_HPP 
#define COORDINATES_HPP 

#include <iostream> 

namespace Core { 
class Coordinates { 
public: 
    Coordinates(); 
    Coordinates(int x, int y); 
    Coordinates(const Coordinates &copy); 
    ~Coordinates(); 

    void operator=(Coordinates coordinates); 
    void operator+=(Coordinates coordinates); 
    void operator-=(Coordinates coordinates); 
    Coordinates operator+(Coordinates coordinates); 
    Coordinates operator-(Coordinates coordinates); 
    bool operator==(Coordinates coordinates); 
    bool operator!=(Coordinates coordinates); 

    int getX() const { return m_x; } 
    int getY() const { return m_y; } 
    void setX(const int &val) { m_x = val; } 
    void setY(const int &val) { m_y = val; } 

protected: 
    int m_x, m_y; 
}; 
} 

だから、問題が表示されます。 アサート:: AreEqual(座標(0,0)、座標(0,0));

エラーが発生しました: エラー1エラーC2678:バイナリ '==': 'const Core :: Coordinates'型の左辺オペランドを取る演算子が見つかりません(または許容される変換はありません)。c: \ program files(x86)\ microsoft visual studio 11.0 \ vc \ unittest \ include \ cppunittestassert.h 129 1 UnitTest1

これを修正するアイデアはありますか?

PS:私の母国語は申し訳ありませんが、母国語ではありません。エラーメッセージが与えられ

答えて

0

、あなたのオペレータが==よりconstの優しい作ってみるかもしれません:

bool operator==(const Coordinates coordinates) const; 
+0

エラーエラーC2338:テスト作家が自分のクラスのクラスのstd ToStringメソッドの特殊化を定義する必要があります::マイクロソフト:: VisualStudioを__cdeclのbasic_string 、クラスのstd ::アロケータ> :: CppUnitTestFramework :: ToString (constクラスCore :: Coordinates&)。 \t c:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ unittest \ include \ cppunittestassert.h UnitTest1 – Winter

+0

これを追加するだけで、変更されていないメソッド/関数/演算子のオーバーロード現在のオブジェクトと変更したくないパラメータは、constでマークする必要があります。 –

+0

そして、コピーを作成する理由がなければ、 'bool operator ==(const座標と座標)const' – Mordachai

16

エラーが代入演算子を作成した後に受け取った、すなわち

エラー1つのエラーC2338:テストWriterは、クラスクラスstd :: basic_string、クラスstd :: allocator> __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString(constクラスCore :: Coordinates &)のToStringの特殊化を定義する必要があります。

は、ユニットテストが予期して受け取った値をプリントアウトする方法を提供する必要があることに関連しています。これを行うには、Microsoft::VisualStudio::CppUnitTestFramework名前空間にToString関数のテンプレート特殊化を作成します。例:

namespace Microsoft{ 
    namespace VisualStudio { 
     namespace CppUnitTestFramework { 

      template<> 
      static std::wstring ToString<Coordinates>(const Coordinates & coord) { 
       return L"Some string representing coordinate."; 
      } 

     } 
    } 
} 

その後、単体テストを実行する必要があります。

+0

なぜテンプレート関数の特殊化を行ったのですか?なぜ関数のオーバーロードを使用しないのですか?この場合のポイントは何ですか? – Adrian

+0

私はあなたに話すことができませんでした。私のC++に関する知識は2014年に悪化しました。私はVisual Studioに実際に触れていませんでした。単純な過負荷が働くかもしれません。 – Gage

+0

この文脈では、両方とも機能します。私は誰も特化した関数テンプレートを使用する前に見たことがありません。彼らが可能であることに気づいていなかった。しかしそれを見て面白かったです。彼らにはいくつかの予期せぬ悪夢があります。なぜなら、それらはあまり使われていないからです。 – Adrian

関連する問題