C++ 标准::向量<;T>;编译错误“;T不能出现在常量表达式中;
首先,我的代码使用编译器在MacOSX上编译并运行良好C++ 标准::向量<;T>;编译错误“;T不能出现在常量表达式中;,c++,g++,llvm,C++,G++,Llvm,首先,我的代码使用编译器在MacOSX上编译并运行良好 i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 但是在Ubuntu上使用编译器 i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 它不会编译 在我的标题中我有 std::vector<
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
但是在Ubuntu上使用编译器
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
它不会编译
在我的标题中我有
std::vector<Obstacle::Obstacle*> obstacles;
有什么想法我需要改变,使它的工作?
是否有一些神奇的编译标志,我应该使用在Ubuntu上,使其工作就像在OSX上
多谢各位
编辑:
障碍物
是一个类。不能将构造函数指针作为存储类型传递
而不是
std::vector<Obstacle::Obstacle*> obstacles;
std::矢量障碍;
试一试
std::矢量障碍;
不能将构造函数指针作为存储类型传递
而不是
std::vector<Obstacle::Obstacle*> obstacles;
std::矢量障碍;
试一试
std::矢量障碍;
显然障碍
只是一个类
令人惊讶的是,在g++4.2、g++4.3、g++4.4、clang++2.9和clang++3.1中测试,以下各项也可以工作:
std::vector<Obstacle::Obstacle::Obstacle::Obstacle::Obstacle*> obstacles;
std::矢量障碍;
多个版本的g++和多个版本的clang编译了上述代码
g++4.5和4.6对此构造存在问题。这看起来像是一个g++错误,版本为4.5及更高版本。那么为什么这应该是合法的呢
这是4.5g++之前版本、clang以及其他编译器中的一个bug。本标准的相关部分为3.4.3.1,第1a段:
如果嵌套名称说明符指定一个类C,并且在C中查找嵌套名称说明符后指定的名称是C的注入类名称(第9条),该名称被视为C类构造函数的名称。此类构造函数名称只能在类定义之外出现的构造函数定义的声明器id中使用
换句话说,障碍::障碍
是非法的,除非在类障碍
的构造函数的越界定义中使用
那么这些编译器是如何解析的呢?这些编译器仅在构造函数定义不一致的情况下才将障碍::障碍
视为具有特殊意义。否则,障碍::障碍
遵循注入的名称规则,但忽略该规则不适用于此处的事实<代码>障碍::障碍*
不是指向构造函数的指针,因为构造函数没有名称<代码>障碍物::障碍物*
表示在类障碍物
的上下文中进行评估时所表示的任何障碍物*
。但是在类内部,barrier*
仍然是指向类barrier
实例的指针<代码>障碍物::障碍物*只是一个障碍物*
,就像障碍物::障碍物*
一样,依此类推。你想要多少障碍,就加多少障碍,它仍然只是一个障碍*显然,障碍只是一个类别
令人惊讶的是,在g++4.2、g++4.3、g++4.4、clang++2.9和clang++3.1中测试,以下各项也可以工作:
std::vector<Obstacle::Obstacle::Obstacle::Obstacle::Obstacle*> obstacles;
std::矢量障碍;
多个版本的g++和多个版本的clang编译了上述代码
g++4.5和4.6对此构造存在问题。这看起来像是一个g++错误,版本为4.5及更高版本。那么为什么这应该是合法的呢
这是4.5g++之前版本、clang以及其他编译器中的一个bug。本标准的相关部分为3.4.3.1,第1a段:
如果嵌套名称说明符指定一个类C,并且在C中查找嵌套名称说明符后指定的名称是C的注入类名称(第9条),该名称被视为C类构造函数的名称。此类构造函数名称只能在类定义之外出现的构造函数定义的声明器id中使用
换句话说,障碍::障碍
是非法的,除非在类障碍
的构造函数的越界定义中使用
那么这些编译器是如何解析的呢?这些编译器仅在构造函数定义不一致的情况下才将
障碍::障碍
视为具有特殊意义。否则,障碍::障碍
遵循注入的名称规则,但忽略该规则不适用于此处的事实<代码>障碍::障碍*不是指向构造函数的指针,因为构造函数没有名称<代码>障碍物::障碍物*表示在类障碍物
的上下文中进行评估时所表示的任何障碍物*
。但是在类内部,barrier*
仍然是指向类barrier
实例的指针<代码>障碍物::障碍物*只是一个障碍物*
,就像障碍物::障碍物*
一样,依此类推。尽可能多的设置障碍物
s,它仍然只是一个障碍物*
有效!我会在8分钟内接受。我是C++新手。我想“障碍::”只是设置名称空间?或者这仅仅是为了功能…?@PiotrNycz:冗余可能是问题的核心。@PiotrNycz我知道没有这样的事情,如果你有更好的名字,我很乐意更新它。关于使用此Foo::Foo
语法引用类的一些奇怪之处的问题。不同的编译器处理它的方式不同。@Bartek-参见其他答案。在C++中,构造函数不是普通的函数/方法。你不能把它的地址记下来。不能为构造函数定义类似类型的地址。你的建议是正确的,但你的解释是错误的。这只是编译器不一致-障碍
应与障碍::障碍
相同,但此编译器不希望以这种方式处理此问题。就这些,行了!我会在8分钟内接受。我是C++新手。我想“障碍::”只是设置名称空间?或者这仅仅是为了功能…?@PiotrNycz:冗余可能是问题的核心。@PiotrNycz我知道没有这样的事情,如果你有的话