考虑以下代码:

#include <map>

template <typename T>
struct X {
    std::map<int, T>* storage = new std::map<int, T>();
};

int main() {
    X<int> x;
}

这可以在clang 3.6.0上编译,但是不能在gcc 5.1上编译。但是,如果storage的类型改为std::vector<T>*(或只是T*),它将进行编译。

我相当确定这是gcc方面的编译器错误(编辑:我将其提交为66344),但是我想确定一下:上述示例是否有任何理由不应该编译?

gcc编译错误:
main.cpp:5:51: error: expected ';' at end of member declaration
     std::map<int, T>* storage = new std::map<int, T>();
                                                   ^

main.cpp:5:51: error: declaration of 'std::map<int, T> X<T>::T'
main.cpp:3:11: error:  shadows template parm 'class T'
 template <typename T>
           ^

main.cpp:5:52: error: expected unqualified-id before '>' token
     std::map<int, T>* storage = new std::map<int, T>();
                                                    ^
main.cpp:5:46: error: wrong number of template arguments (1, should be at least 2)
     std::map<int, T>* storage = new std::map<int, T>();
                                              ^

In file included from /usr/local/include/c++/5.1.0/map:61:0,
                 from main.cpp:1:
/usr/local/include/c++/5.1.0/bits/stl_map.h:96:11: note: provided for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'
     class map
           ^

最佳答案

这是Core issue 325中描述的问题的另一个示例(请参见“来自2011年8月 session 的说明”,该示例具有非常相似的示例),即,模板参数列表中的逗号在编译器尝试确定位置时导致解析失败。表达式的结尾是。

这个问题仍然悬而未决,但是委员会的共识是应该使它起作用(我不知道为了使它有效将进行哪些更改)。

Clang已经实现了一种解决方法一段时间(可能会暂时解析该表达式并在失败时重试),而Nathan Sidwell只是un-suspended the relevant G++ bug and assigned it to himself,所以我希望他计划尽快修复它。

07-24 09:45
查看更多