[英]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.