我遇到了将这段代码从MSVC转换为g++的问题:
#include <unordered_map>
class A
{
template <class T> class B;
template<>
class A::B<int>
{
};
std::unordered_map<int, long, B<int>> m_Map;
};
可以肯定,这不是标准的c++,而VS仍然允许它,GCC(g++)会引发错误“非命名空间范围内的显式专门化”。现在,按照参考http://en.cppreference.com/w/cpp/language/template_specialization使它符合c++:
#include <unordered_map>
class A
{
template <class T> class B;
template <> class B<int>;
std::unordered_map<int, long, B<int>> m_Map;
};
template<>
class A::B<int>
{
std::size_t operator()(int const& n) const {
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
return 0;
}
,现在VS给我一个错误
Error 3 error C2079: 'std::_Hash_oper1<true,_Hasher>::_Hashobj' uses undefined class 'A::B<int>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\xhash
和
Error 2 error C2139: 'A::B<int>' : an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_empty' c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits
因此,无序映射绝对不希望使用它认为的“ undefined 类”。即使我向前声明了它。
有人知道这是怎么回事吗?谢谢。
最佳答案
标准库容器不能用不完整的类型声明为所包含的类型。这将导致 undefined 的行为,而无需任何诊断(这意味着某些编译器可能看起来会接受它,而有些可能会拒绝它或在运行时表现异常)。
您必须使用不支持不完整类型的其他库中的哈希表(例如,boost),或者重新设计代码。
一个简单的解决方法是首先使类B
不在A
中声明