具有范围分辨率和条件的C ++三元运算符

时间:2017-04-18 12:04:29

标签: c++ linux g++ ternary-operator

以下代码未由特定编译器编译。

#include <iostream>

using namespace std;

class A{
        public:
                static const int x = 12;
                static const int y = 16;
};

int main(){
        int a = 12, b = 19;
        int z = (a==b)?(A::x):(A::y);
        cout<<z<<endl;
        return 0;
}

编译器 g ++(GCC)4.8.5 20150623(Red Hat 4.8.5-11)已成功编译。

编译器 g ++(GCC)4.4.7 20120313(Red Hat 4.4.7-17)导致编译错误

test.cpp:(.text+0x20): undefined reference to `A::x'
test.cpp:(.text+0x28): undefined reference to `A::y'

如果我将行(a==b)中的条件int z = (a==b)?(A::x):(A::y);替换为truefalse,则会成功编译。

是什么原因以及如何为指定的编译器修复它?

1 个答案:

答案 0 :(得分:0)

看起来像gcc 4.4的弱/错误的C ++ 0x符号链接实现。 似乎gcc 4.4告诉链接器有符号,但它忘了&#34;实现&#34;他们在其中一个编制单位。

我想如果你将静态成员A :: x和A :: y的初始化显式地放到一个唯一的编译单元(例如相应的.cpp文件)中,那么你的代码可能与两个编译器兼容。