C++ VS2012:单元测试错误:断言::AreEqual(对象,对象)没有';行不通

C++ VS2012:单元测试错误:断言::AreEqual(对象,对象)没有';行不通,c++,unit-testing,visual-c++,visual-studio-2012,C++,Unit Testing,Visual C++,Visual Studio 2012,在VS 2012上使用Visual Studio本机单元测试时,我遇到了一个奇怪的问题。 我有一个这样的坐标类: #ifndef COORDINATES_HPP #define COORDINATES_HPP #include <iostream> namespace Core { class Coordinates { public: Coordinates(); Coordinates( int x, int y ); Coordinates( con

在VS 2012上使用Visual Studio本机单元测试时,我遇到了一个奇怪的问题。 我有一个这样的坐标类:

#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;
};
}
\ifndef坐标\u水电站
#定义HPP的坐标
#包括
名称空间核心{
类坐标{
公众:
坐标();
坐标(整数x,整数y);
坐标(常量坐标和副本);
~Coordinates();
void运算符=(坐标);
void运算符+=(坐标);
void运算符-=(坐标);
坐标运算符+(坐标);
坐标操作符-(坐标);
布尔运算符==(坐标);
布尔运算符!=(坐标);
int getX()常量{return m_x;}
int getY()常量{return m_y;}
void setX(const int&val){m_x=val;}
void setY(const int&val){m_y=val;}
受保护的:
int m_x,m_y;
};
}
因此,当我使用时出现问题: Assert::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:对不起,我的英语不是我的母语。

如果出现错误消息,您可以尝试使您的运算符==对常量更友好:

bool operator==( const Coordinates coordinates ) const;

创建赋值运算符后收到的错误,即

错误1错误C2338:测试编写器必须为类std::basic\u string、类std::allocator>\uu cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString(const class 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.";
            }

        }
    }
}
名称空间Microsoft{
命名空间VisualStudio{
命名空间cppuntestframework{
模板
静态标准::wstring-ToString(常量坐标和坐标){
返回L“表示坐标的字符串。”;
}
}
}
}

之后,应该运行单元测试。

错误1错误C2338:测试编写器必须为类std::basic_string uu cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString(const class Core::Coordinates&)定义ToString的专门化。c:\program files(x86)\microsoft visual studio 11.0\vc\unittest\include\cppunittestassert.h 66 1 UnitTest1只是为了补充一点,对于任何不更改当前对象的方法/函数/运算符重载以及任何不打算更改的参数,都应该用常量标记。除非有理由创建副本,否则请使用
bool operator==(常数坐标和坐标)常数
'bool运算符==(常数坐标和坐标)我尝试这个,但我也有同样的错误。为什么你要做模板函数的专业化?为什么不使用函数重载?这个例子有什么意义?我不能告诉你。我的C++知识在2014年更坏了。从那时起我还没有真正地接触Visual Studio。可能是简单的重载会起作用。在这方面,他们是这项工作。我以前从未见过有人使用专门的函数模板。我甚至没有意识到它们是可能的。但查找它很有趣。尽管它们有一些意想不到的缺陷,这也是它们没有被大量使用的原因。现在是2019年,这项功能仍然适用于Visual Studio 2019。