【发布时间】:2015-08-13 07:50:26
【问题描述】:
考虑以下代码:
#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),但我想我会要求确保:上面的示例是否有任何原因应该t 编译?
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
^
【问题讨论】:
-
只是为了确定:您使用的是
gcc还是g++?我经常把它混在一起...... -
@atlaste g++ 4.9.2 也不编译这个。
-
@atlaste 老兄,显然我们使用的是 C++ 编译器 - 如果我们使用的是 C 编译器,它会抱怨这段代码中的各种其他内容。
-
解决方法:使用 braced-init-list 来规避
g++=>template <typename T> struct X { std::map<int, T>* storage { new std::map<int, T> () }; };的(错误)行为> -
@FilipRoséen-refp,G++ 没有故障,它符合标准,请参阅open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#325(尽管使用花括号初始化列表是一种有效的解决方法)
标签: c++ c++11 gcc language-lawyer