g ++中明确的模板特化导致麻烦

时间:2015-12-06 20:39:30

标签: c++ c++11 gcc g++

我遇到了将这段代码从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

因此,无序的地图definetely不想使用它所考虑的“未定义的类”。即使我向前宣布它。 有没有人知道这是什么一回事?谢谢。

1 个答案:

答案 0 :(得分:1)

标准库容器不能使用不完整类型声明为包含的类型。这会导致未定义的行为,无需诊断(这意味着某些编译器可能会接受它,有些可能会拒绝它或在运行时表现得很奇怪)。

您必须使用支持不完整类型的不同库(例如,增强版)中的哈希表,或者重新设计代码。

一个简单的解决方法是让BA内首先宣布<{1}}