如何使用静态成员变量

时间:2017-12-12 10:48:40

标签: c++

我有一个继承树,需要声明每个类的UUID。 我选择将其实现为"静态constexpr const char *"表达

但是,我希望下面的代码失败(我希望任何接口实现者都必须提供一个UUID字段),但它可以用clang编译好(尽管UUID在I接口中被注释)。

我希望代码失败,因为我希望任何接口实现者派生IBase为其接口显式提供自己的专用UUID。

此外,我希望它失败,因为我认为静态成员变量是一个类成员,因此与继承行为无关(我希望静态成员变量范围只是它定义的类)。

解释是什么?

class C {
public:
    C() = default;
    ~C() = default;
    template <class T>
    void addElement(T* componentThis, const char * name);

private:
    std::map<boost::uuids::uuid, void*> m_elements;
};

template <class T>
void C::addElement(T* elementThis, const char * name)
{
    boost::uuids::uuid elementId = toUUID(T::UUID);
    m_elements[elementId]=elementThis;
}

class IBase {
public:
    virtual ~IBase() = default;

    static constexpr const char * UUID = "F601639A-17D0-4A25-B85A-DF5753357A0A";
};

class I : public virtual IBase {
public:
    virtual ~I() = default;
    virtual void f() = 0;

  //  static constexpr const char * UUID = "CEE87DFF-07C3-42B7-AFA8-047CDAFBD177";
};

class E : public C, public I {
public:
    E() { addElement<I>(this,"E"); }
    ~E() = default;
    inline void f() override { std::cout<<"Calling f"<<std::endl; }

    static constexpr const char * UUID = "3126D74D-7BE4-4AD4-93FB-D2616859C44F";
};

int main(int argc, char *argv[])
{ 
  E e;
  e.f();
}

0 个答案:

没有答案