2013-05-01 33 views
7

Tôi đến với bạn cho một vấn đề lạ khi tôi sử dụng Visual Studio Native Unit Test trên VS 2012. Tôi đã là một tọa độ lớp như thế:VS2012: Lỗi với kiểm tra đơn vị: Assert :: AreEqual (đối tượng, đối tượng) không hoạt động

#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; 
}; 
} 

Vì vậy, vấn đề xuất hiện khi tôi sử dụng: Khẳng định :: AreEqual (Tọa độ (0,0), Tọa độ (0,0));

Lỗi được gửi là: Lỗi 1 lỗi C2678: nhị phân '==': không tìm thấy toán tử bên trái. \ Program files (x86) \ microsoft visual studio 11.0 \ vc \ unittest \ include \ cppunittestassert.h 129 1 UnitTest1

Bạn có ý tưởng sửa lỗi đó không?

PS: Xin lỗi vì tiếng anh của tôi, không phải là ngôn ngữ mẹ đẻ của tôi.

Trả lời

0

Với thông báo lỗi, bạn có thể thử làm điều hành của bạn == const thân thiện hơn:

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

Lỗi lỗi C2338: Kiểm tra nhà văn phải xác định chuyên môn của ToString cho std lớp lớp học của bạn :: basic_string , lớp std :: cấp phát > __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString (const class Core :: Coordinates &). \t c: \ program files (x86) \ microsoft visual studio 11.0 \ vc \ unittest \ include \ cppunittestassert.h UnitTest1 – Winter

+0

Chỉ cần thêm vào đó, cho bất kỳ quá tải phương thức/hàm/toán tử nào không thay đổi đối tượng hiện tại và bất kỳ tham số nào mà bạn không có ý định thay đổi phải được đánh dấu bằng một const. –

+0

Và trừ khi có lý do để tạo bản sao, hãy đi với 'toán tử bool == (const Tọa độ & tọa độ) const' – Mordachai

16

Các lỗi nhận được sau khi tạo toán tử gán của bạn, ví dụ:

Lỗi 1 lỗi C2338: Test nhà văn phải xác định chuyên môn của ToString cho lớp học của bạn std :: basic_string, lớp std :: allocator> __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString (const lớp Core :: Tọa độ &).

liên quan đến việc cần phải cung cấp một cách để kiểm tra đơn vị in ra các giá trị mong đợi và nhận được. Bạn làm điều này bằng cách tạo một chuyên môn mẫu của hàm ToString trong không gian tên Microsoft::VisualStudio::CppUnitTestFramework. Ví dụ:

namespace Microsoft{ 
    namespace VisualStudio { 
     namespace CppUnitTestFramework { 

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

     } 
    } 
} 

Sau đó, kiểm tra đơn vị sẽ chạy.

+0

Tại sao bạn làm chuyên môn về chức năng mẫu? Tại sao không chỉ sử dụng quá tải chức năng? Điểm trong trường hợp này là gì? – Adrian

+0

Tôi không thể nói với bạn. Kiến thức của tôi về C++ đã tồi tệ hơn vào năm 2014 và tôi đã không thực sự chạm vào Visual Studio kể từ đó. Nó có thể là quá tải đơn giản sẽ làm việc. – Gage

+0

Trong ngữ cảnh này, cả hai đều hoạt động. Tôi đã không nhìn thấy bất cứ ai sử dụng một mẫu chức năng chuyên ngành trước đây. Thậm chí không nhận ra rằng họ có thể. Nhưng thật thú vị khi tìm kiếm nó. Tuy nhiên, có một vài cái bẫy bất ngờ với chúng, đó là lý do tại sao chúng không được sử dụng nhiều. – Adrian

Các vấn đề liên quan