问题是这样的,我有一个静态类,其中包含多个用于获取输入的静态函数。该类包含一个私有静态成员变量来指示用户是否输入了任何信息。每个输入方法都会检查用户是否输入了任何信息,并相应地设置状态变量。我认为现在是使用三元运算符的好时机。不幸的是,我不能这样做,因为编译器不喜欢它。
我复制了问题,并简化了我的代码,使其尽可能容易理解。这不是我的原始代码。
这是我的头文件:
#include <iostream>
using namespace std;
class Test {
public:
void go ();
private:
static const int GOOD = 0;
static const int BAD = 1;
};
这是我的实现方式,使用三元运算符:
#include "test.h"
void Test::go () {
int num = 3;
int localStatus;
localStatus = (num > 2) ? GOOD : BAD;
}
这是主函数:
#include <iostream>
#include "test.h"
using namespace std;
int main () {
Test test = Test();
test.go();
return 0;
}
当我尝试编译这段代码时,得到了以下错误信息:
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
然而,如果我将这个替换成:
localStatus = (num > 2) ? GOOD : BAD;
用这个:
if (num > 2) {
localStatus = GOOD;
} else {
localStatus = BAD;
}
代码编译并按预期运行。是哪个C++规则或GCC边角情况导致了这种疯狂的结果?(我在Ubuntu 9.10上使用GCC 4.4.1。)
GOOD
,因此需要一个定义吗?我认为gcc足够聪明,在将lvalueGOOD
用作赋值操作符的RHS时避免了外部链接(因此立即进行了lvaue-rvalue转换),但在三元运算符中使用lvalueGOOD
时尚未完成,但我准备相信我可能是错的。 - Steve Jessop+GOOD
或者int a = GOOD
,那么你会在左值GOOD
上进行左值到右值的转换("直接" - 参见3.2p2,在这种情况下,你不会 "使用" 变量)。如果你执行int a = x ? a : b;
,那么你会在三元运算符产生的左值上进行左值到右值的转换,而不是在a
和b
产生的左值上进行。 - Johannes Schaub - litb