簡體   English   中英

在C ++中訪問模板類的私有構造函數

[英]Accessing a private constructor of a template class in C++

我在嘗試訪問派生類的私有構造函數時遇到一些困難,該私有構造函數被指定為模板參數。 我希望指定friend T可以解決此問題,但不幸的是,它沒有任何作用。

template <typename T>
class Creator
{
public:

    static void Create()
    {
        instance = new T;
    }
private:
    static T* instance;
    friend T;
};

template <typename T>
T* Creator<T>::instance(nullptr);

class Test
{
private:
    Test() {}
};

創建嘗試:

int main()
{
     Creator<Test>::Create();
}

我得到的錯誤是:

錯誤C2248:“派生::派生”:無法訪問在“派生”類中聲明的私有成員

有什么想法可以解決這個問題嗎?

您的Creator類無需授予朋友訪問其模板參數的權限。

template <typename T>
class Creator
{
public:

    static void Create()
    {
        instance = new T;
    }
private:
    static T* instance;
    // friend T; NOT USEFUL
};

您需要從具有私有成員的類中提供朋友訪問權限。

class Test
{
    friend Creator<Test>; // provide friend access to Creator<Test> specialization
private:
    Test()
    {
    }
};

這使您的代碼可以編譯並獲得所需的行為。

注意,聲明friend T; 在您的模板類中,您實際上是在將私有成員暴露於您通過Creator專門研究的T中。 因此,您可以讓某人寫...

class Test
{
private:
    Test()
    {
        // you don't really want this, do you?
        delete Creator<Test>::instance;
    }
};

...如果他們使用了您的創作者模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM