相关疑难解决方法(0)

对静态类成员的未定义引用

谁能解释为什么以下代码无法编译?至少在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)

c++ g++

191
推荐指数
5
解决办法
11万
查看次数

未定义的对静态const int的引用

我今天遇到了一个有趣的问题.考虑这个简单的例子:

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中得到太多能够处理这种情况?或者这是我出于某种原因不应该做的事情?

c++ gcc

72
推荐指数
4
解决办法
3万
查看次数

在struct/class中使用静态const int

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页); 除声明外,我们还需要一个定义.任何人都可以解释为什么这是一个例外?

c++

10
推荐指数
2
解决办法
2万
查看次数

标签 统计

c++ ×3

g++ ×1

gcc ×1