uint16_t与int64_t在VSTest中为何缺失ToString特化?
问题描述
一段VSTest代码原本可正常编译,但取消注释其中uint16_t或int64_t对应的Assert::AreEqual调用后,会触发Error C2338错误,提示需要为这两个类型定义ToString<const Q& q>模板特化。查看CppUnitTestAssert.h后确认,框架确实缺少这两个类型的ToString特化实现,现需了解它们最初缺失的原因。
测试代码示例
#include "CppUnitTest.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; TEST_CLASS(foo) { TEST_METHOD(bar) { Assert::AreEqual((int8_t)1, (int8_t)1); Assert::AreEqual((uint8_t)1, (uint8_t)1); Assert::AreEqual((int16_t)1, (int16_t)1); // Assert::AreEqual((uint16_t)1, (uint16_t)1); Assert::AreEqual((int32_t)1, (int32_t)1); Assert::AreEqual((uint32_t)1, (uint32_t)1); // Assert::AreEqual((int64_t)1, (int64_t)1); Assert::AreEqual((uint64_t)1, (uint64_t)1); } };
CppUnitTestAssert.h中已有的ToString特化示例
template<> inline std::wstring ToString<bool> (const bool& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<int> (const int& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<long> (const long& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<short> (const short& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<char> (const char& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<wchar_t> (const wchar_t& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<signed char> (const signed char& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<unsigned int> (const unsigned int& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<unsigned long> (const unsigned long& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<unsigned long long> (const unsigned long long& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<unsigned char> (const unsigned char& t) { RETURN_WIDE_STRING(t); } template<> inline std::wstring ToString<std::string> (const std::string& t) { RETURN_WIDE_STRING(t.c_str()) ; } template<> inline std::wstring ToString<std::wstring> (const std::wstring& t) { return t; }
缺失原因分析
- 类型别名的严格匹配限制
uint16_t和int64_t是C标准库<cstdint>定义的固定宽度整数类型别名,而非C原生内置类型。CppUnitTest框架的ToString特化仅针对原生内置类型实现,而C模板特化要求类型严格匹配,别名无法自动映射到对应的原生类型特化:
uint16_t通常是unsigned short的别名,但框架未提供ToString<unsigned short>的特化;int64_t通常是long long的别名,但框架未提供ToString<long long>的特化(仅实现了unsigned long long版本)。
- 框架迭代的功能遗漏
VSTest的CppUnitTest框架在逐步完善类型支持时,优先覆盖了使用频率更高的原生类型和部分固定宽度类型,却遗漏了这两个类型的特化补充。比如已支持uint64_t(对应unsigned long long的特化),但未同步添加int64_t对应的signed long long特化;覆盖了signed short,但未添加unsigned short的特化以支持uint16_t。
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

