在T的静态成员中使用sizeof(T)导致c ++错误

时间:2018-06-30 14:53:14

标签: c++ sizeof

为什么我的编译器不允许这样做?

class News;
class ISubscriber {
public:
    News *news;
    virtual void update() = 0;
};

class News {
public:
    float getVersion() { return this->version; }
    void setVersion(float state) { this->version= state; this->notifyAllSubscribers(); }
    void attach(ISubscriber *observer) { this->subscribers.push_back(observer); }
    void notifyAllSubscribers() {
        for (vector<ISubscriber*>::iterator it = subscribers.begin(); it != subscribers.end(); it++){
            (*(*it)).update();
        }
    }
private:
    vector<ISubscriber*> subscribers;
    float version;
};

3 个答案:

答案 0 :(得分:6)

[expr.sizeof]/1

  

sizeof运算符不得应用于具有函数或不完整类型的表达式

[class.mem]/6,请强调:

  

class-specifier 的结尾}处,类被视为完全定义的对象类型([basic.types])(或完整类型)。在类 member-specification 中,该类在函数体,默认参数, noexcept-specifier 和默认成员初始值设定项(包括嵌套类中的此类)内被视为完整的)。 否则,在其自身的成员规范类中,它被视为不完整。

答案 1 :(得分:1)

我的旧处方,将其包装在一个函数中

class Resource{
    //...
    auto constexpr max_instances=10;

    static auto& memory(){
        static std::aligned_storage<sizeof(Resource),alignof(Resource)> storage[max_instances];
        return storage;
    };
};

答案 2 :(得分:0)

我认为这是因为您尚未完成对类的定义,因此编译器不知道它的大小,从而产生此错误。我不知道您要在这里完成什么,使用aschepler的答案,并在实际的类定义之外定义静态const char