谁能解释为什么以下代码无法编译?至少在g ++ 4.2.4上.
更有趣的是,为什么它会在我将MEMBER转换为int时进行编译?
#include <vector>
class Foo {
public:
static const int MEMBER = 1;
};
int main(){
vector<int> v;
v.push_back( Foo::MEMBER ); // undefined reference to `Foo::MEMBER'
v.push_back( (int) Foo::MEMBER ); // OK
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我今天遇到了一个有趣的问题.考虑这个简单的例子:
template <typename T>
void foo(const T & a) { /* code */ }
// This would also fail
// void foo(const int & a) { /* code */ }
class Bar
{
public:
static const int kConst = 1;
void func()
{
foo(kConst); // This is the important line
}
};
int main()
{
Bar b;
b.func();
}
Run Code Online (Sandbox Code Playgroud)
编译时我收到一个错误:
Undefined reference to 'Bar::kConst'
Run Code Online (Sandbox Code Playgroud)
现在,我很确定这是因为static const int没有在任何地方定义,这是有意的,因为根据我的理解,编译器应该能够在编译时进行替换而不需要定义.但是,由于函数接受一个const int &参数,它似乎没有进行替换,而是更喜欢引用.我可以通过进行以下更改来解决此问题:
foo(static_cast<int>(kConst));
Run Code Online (Sandbox Code Playgroud)
我相信这现在迫使编译器创建一个临时的int,然后传递一个引用,它可以在编译时成功完成.
我想知道这是故意的,还是我期望从gcc中得到太多能够处理这种情况?或者这是我出于某种原因不应该做的事情?
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
return A::B::b;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码编译.但是,如果你选择Scott Myers的Effective C++书籍(第14页); 除声明外,我们还需要一个定义.任何人都可以解释为什么这是一个例外?