我有一个继承树,需要声明每个类的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();
}