Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标准::向量<;T>;编译错误“;T不能出现在常量表达式中;_C++_G++_Llvm - Fatal编程技术网

C++ 标准::向量<;T>;编译错误“;T不能出现在常量表达式中;

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<

首先,我的代码使用编译器在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<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我知道没有这样的事情,如果你有的话