這段代碼中如果不將繼承的基類模版聲明爲友元類就會出現編譯錯誤,因爲基類函數調用了子類的保護(也可以是私有)構造函數
template <typename T>
class Base
{
public:
static T* instance()
{
return new T();
}
Base() = default;
virtual ~Base() = default;
};
class Derived : public Base<Derived>
{
friend class Base<Derived>;
protected:
Derived() = default;
};
int main()
{
Derived* derive = Derived::instance();
}