为什么静态成员变量不能与三元运算符一起使用?

Eva*_*ske 15 c++ static ternary-operator static-members

这是交易.我有一个静态类,其中包含几个用于获取输入的静态函数.该类包含一个私有静态成员变量,用于指示用户是否输入了任何信息.每种输入方法都会检查用户是否输入了任何信息,并相应地设置状态变量.我认为这是使用三元运算符的好时机.不幸的是,我不能,因为编译器不喜欢这样.

我复制了这个问题,然后尽可能地简化了我的代码,使其易于理解.这不是我的原始代码.

这是我的头文件:

#include <iostream>

using namespace std;

class Test {
public:
    void go ();
private:
    static const int GOOD = 0;
    static const int BAD = 1;
};
Run Code Online (Sandbox Code Playgroud)

这是我使用三元运算符的实现:

#include "test.h"

void Test::go () {
    int num = 3;
    int localStatus;
    localStatus = (num > 2) ? GOOD : BAD;
}
Run Code Online (Sandbox Code Playgroud)

这是主要功能:

#include <iostream>
#include "test.h"

using namespace std;

int main () {
    Test test = Test();
    test.go();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到此错误消息:

test.o: In function `Test::go()':
test.cpp:(.text+0x17): undefined reference to `Test::GOOD'
test.cpp:(.text+0x1f): undefined reference to `Test::BAD'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

但是,如果我替换它:

localStatus = (num > 2) ? GOOD : BAD;
Run Code Online (Sandbox Code Playgroud)

有了这个:

if (num > 2) {
    localStatus = GOOD;
} else {
    localStatus = BAD;
}
Run Code Online (Sandbox Code Playgroud)

代码按预期编译和运行.什么模糊的C++规则或GCC角落案件是造成这种疯狂的原因?(我在Ubuntu 9.10上使用GCC 4.4.1.)

Joh*_*itb 19

这是根据C++标准.三元运算符确实构成了一个左值,它将引用任一个GOODBAD在运行时.左值转换的左值不会立即应用于左值GOODBAD,因此您需要定义GOODBAD.

请参阅核心语言问题报告http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#712.

作为一种变通方法,您可以应用显式强制转换int(读取它们的值,从而对左值转换执行左值)或使用读取值的运算符,如+:

localStatus = (num > 2) ? +GOOD : +BAD;
Run Code Online (Sandbox Code Playgroud)


Jam*_*lis 5

class Test {
    static const int GOOD = 0;
    static const int BAD = 1;
};
Run Code Online (Sandbox Code Playgroud)

这些只是声明 ; 它们不是定义.您需要在一个.cpp文件中提供除类定义之外的静态成员变量的定义:

const int Test::GOOD;
const int Test::BAD;
Run Code Online (Sandbox Code Playgroud)

或者,对于整数常量,使用以下内容通常更方便enum:

class Test {
    enum { 
        GOOD = 0,
        BAD = 1 
    };
};
Run Code Online (Sandbox Code Playgroud)

  • 为什么缺少定义会打扰三元运算符而不是标准赋值运算符? (2认同)