2013-05-01 75 views
7

我在VS 2012上使用Visual Studio Native Unit Test時遇到了一個奇怪的問題。 我有一個座標類這樣的:VS2012:單元測試錯誤:Assert :: AreEqual(object,object)不起作用

#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

由於錯誤信息,你可以嘗試讓你的操作更加==常量友好:創建賦值運算符後收到

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

錯誤錯誤C2338:測試作家必須定義的ToString 專業化爲你的類類的std :: basic_string的,一流的std ::分配器> __cdecl微軟的VisualStudio :: :: CppUnitTestFramework :: ToString (const class Core :: Coordinates&)。 \t C:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ unittest \ include \ cppunittestassert.h 1單元測試1 – Winter 2013-05-01 03:47:55

+0

只是爲了補充說明,對於任何不改變的方法/函數/運算符重載當前對象和任何你不打算改變的參數應該用一個const標記。 – 2013-05-01 03:48:39

+0

除非有理由創建副本,否則請使用'bool operator ==(const Coordinates&coordinates)const' – Mordachai 2013-05-01 03:54:43

16

錯誤,即

錯誤1錯誤C2338:測試編寫者必須爲你的類類定義ToString的專用化std :: basic_string,class std :: allocator> __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString(const class Core :: Coordinates &)。

與需要爲單元測試提供打印出預期和收到的值的方法有關。您可以通過在名稱空間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 2017-10-05 19:30:40

+0

我無法告訴你。我對C++的瞭解在2014年有所惡化,從那時起我就沒有真正接觸過Visual Studio。這可能是簡單的超負荷工作。 – Gage 2017-10-14 08:56:55

+0

在這種情況下,他們都工作。我剛纔沒有見過任何人使用過專門的函數模板。甚至沒有意識到它們是可能的。但看起來很有趣。雖然他們有一些意想不到的問題,這就是爲什麼他們沒有太多用處。 – Adrian 2017-10-14 22:30:50

相關問題