2

我收到以下錯誤,當我試圖在Visual Studio 2013來編譯單元測試:C2338編譯錯誤對Microsoft Visual Studio的單元測試

錯誤1個錯誤C2338:測試作家必須定義的ToString專業化< q * q >爲你的類類的std :: basic_string的< wchar_t的,結構的std :: char_traits < wchar_t的>,一流的std ::分配器< wchar_t的> > _ _ CDECL微軟的VisualStudio :: :: CppUnitTestFramework ::的ToString <結構HINSTANCE _ _ >(struct HINSTANCE _ _ *)。

const std::wstring moduleName = L"kernel32.dll"; 
const HMODULE expected = GetModuleHandle(moduleName.c_str()); 
Microsoft::VisualStudio::CppUnitTestFramework::Assert::AreEqual(expected, expected); 

有誰知道我需要怎麼去寫的ToString這樣的專業化:

可以由具有試驗方法如下面複製錯誤?

回答

5

我設法通過將下面的代碼到我的單元測試類文件來解決問題:

/* ToString specialisation */ 
namespace Microsoft 
{ 
    namespace VisualStudio 
    { 
     namespace CppUnitTestFramework 
     { 
      template<> static std::wstring ToString<struct HINSTANCE__> 
       (struct HINSTANCE__ * t) 
      { 
       RETURN_WIDE_STRING(t); 
      } 
     } 
    } 
} 

我此基礎上CppUnitTestAssert.h的內容(這是編譯錯誤發生 - 雙擊關於編譯錯誤會爲你打開這個文件)。

在文件頂部附近(如果雙擊上面提到的編譯錯誤,只會向下幾行),您可以看到一組ToString模板。我複製了其中一行並將其粘貼到我的測試類文件中(與原始模板包含在相同的命名空間中)。

然後我簡單地修改模板以匹配編譯錯誤(特別是<struct HINSTANCE__>(struct HINSTANCE__ * t))。

對於我的場景,使用RETURN_WIDE_STRING(t)就足以顯示我的AreSame聲明中的不匹配。根據所使用的類型,您可以進一步提取其他有意義的文本。

3

我在比較類對象時遇到同樣的問題。 對我來說,我可以簡單地寫

Assert::IsTrue(bitmap1 == bitmap2); 

,而不是

Assert::AreEqual(bitmap1, bitmap2); 
解決問題