错误 C2338:测试作者必须为您的 class 定义 ToString<const Q& q> 的特化
error C2338: Test writer must define specialization of ToString<const Q& q> for your class
我目前在 Visual Studio 2013 C++/CLI 本机单元测试中遇到以下错误。
error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class LTI::IPCommon::CPPBoxesBuffer>(const class LTI::IPCommon::CPPBoxesBuffer &). c:\program files (x86)\microsoft visual studio 12.0\vc\unittest\include\cppunittestassert.h
我尝试了 VS2012 : Error with unit test : Assert::AreEqual( object, object ) didn't work 中建议的解决方案并编写了一个专业化,但它没有用。
这里是 BoxesBuffer.h 中的 class:
class CPPBoxesBuffer{
private:
unsigned char* _data;
int _lines;
public:
CPPBoxesBuffer(unsigned char* data, int lines){ _data = data; _lines = lines; };
// Methods for std::map. Class must be Assignable
CPPBoxesBuffer(){ _data = nullptr; _lines = 0; };
CPPBoxesBuffer(const CPPBoxesBuffer& other)
{
_lines = other._lines;
_data = other._data;
}
CPPBoxesBuffer& operator=(const CPPBoxesBuffer& other)
{
_lines = other._lines;
_data = other._data;
return *this;
}
bool operator==(const CPPBoxesBuffer& other) const
{
return _lines == other._lines && _data == other._data;
}
};
这是测试:
TEST_METHOD(ShouldSetAndGetCppBoxesBufferData)
{
std::string key = "WhenPassingData";
unsigned char t[5] = { 'a', 'b', 'c', 'd', 'e' };
CPPBoxesBuffer data(t, 5);
auto result = data;
auto db = data == result; // This compiles.
Assert::AreEqual(data, result); // This fails with the error.
}
这是我写的专业:
#include "CppUnitTest.h"
#include "BoxesBuffer.h"
namespace Microsoft
{
namespace VisualStudio
{
namespace CppUnitTestFramework
{
template<> static std::wstring ToString<CPPBoxesBuffer>(const class CPPBoxesBuffer& t) { return L"CppBoxesBuffer"; }
}
}
}
我做错了什么?
你的专业化声明在Assert::AreEqual
行可以看到的地方吗?我相信如果它在不同的 cpp 文件中并且没有在头文件中原型化,那么在编译 Assert::AreEqual
时将找不到它。
我目前在 Visual Studio 2013 C++/CLI 本机单元测试中遇到以下错误。
error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class LTI::IPCommon::CPPBoxesBuffer>(const class LTI::IPCommon::CPPBoxesBuffer &). c:\program files (x86)\microsoft visual studio 12.0\vc\unittest\include\cppunittestassert.h
我尝试了 VS2012 : Error with unit test : Assert::AreEqual( object, object ) didn't work 中建议的解决方案并编写了一个专业化,但它没有用。
这里是 BoxesBuffer.h 中的 class:
class CPPBoxesBuffer{
private:
unsigned char* _data;
int _lines;
public:
CPPBoxesBuffer(unsigned char* data, int lines){ _data = data; _lines = lines; };
// Methods for std::map. Class must be Assignable
CPPBoxesBuffer(){ _data = nullptr; _lines = 0; };
CPPBoxesBuffer(const CPPBoxesBuffer& other)
{
_lines = other._lines;
_data = other._data;
}
CPPBoxesBuffer& operator=(const CPPBoxesBuffer& other)
{
_lines = other._lines;
_data = other._data;
return *this;
}
bool operator==(const CPPBoxesBuffer& other) const
{
return _lines == other._lines && _data == other._data;
}
};
这是测试:
TEST_METHOD(ShouldSetAndGetCppBoxesBufferData)
{
std::string key = "WhenPassingData";
unsigned char t[5] = { 'a', 'b', 'c', 'd', 'e' };
CPPBoxesBuffer data(t, 5);
auto result = data;
auto db = data == result; // This compiles.
Assert::AreEqual(data, result); // This fails with the error.
}
这是我写的专业:
#include "CppUnitTest.h"
#include "BoxesBuffer.h"
namespace Microsoft
{
namespace VisualStudio
{
namespace CppUnitTestFramework
{
template<> static std::wstring ToString<CPPBoxesBuffer>(const class CPPBoxesBuffer& t) { return L"CppBoxesBuffer"; }
}
}
}
我做错了什么?
你的专业化声明在Assert::AreEqual
行可以看到的地方吗?我相信如果它在不同的 cpp 文件中并且没有在头文件中原型化,那么在编译 Assert::AreEqual
时将找不到它。