代码:
#include "stdafx.h"
#include "CppUnitTest.h"
#include <vector>
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace unit_test
{
TEST_CLASS(test_iterator)
{
public:
TEST_METHOD(vector_with_int)
{
std::vector<int> samples;
Assert::AreEqual(samples.begin(), samples.begin());
}
};
}
编译时:
错误1错误C2338:测试编写者必须为您的类类std :: basic_string定义ToString的特化,类std :: allocator&gt; __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString&gt; &gt;&gt;(const class std :: _ Vector_iterator&gt;&gt;&amp;)。 c:\ program files(x86)\ microsoft visual studio 12.0 \ _vc \ unittest \ include \ cppunittestassert.h 66 1 unit_test
如何解决这个问题?我应该使用另一个框架吗?
答案 0 :(得分:2)
您可能希望从每个迭代器中减去begin
(如果它们是随机迭代器),那么您要比较size_type
偏移而不是迭代器类型:
Assert::AreEqual(samples.begin() - samples.begin(), samples.begin() - samples.begin());
答案 1 :(得分:1)
在测试之前添加这样的东西:
namespace Microsoft { namespace VisualStudio { namespace CppUnitTestFramework {
using vecint_itr = typename std::vector<int>::iterator;
template<> inline std::wstring ToString<vecint_itr>(vecint_itr const & t)
{
return L"vecint_itr"; // replace with string with whatever you like
}
}}}
这会将一个ToString函数注入到CppUnitTestFramework中,这需要将迭代器转换为可由测试框架显示的字符串值。这正是错误消息要求您做的事情。