[英]How can I use template class inside of template class as a template template parameter with a template parameter?
[英]How can I use a private inner template class as a parameter in a template specialization?
在嘗試使用 clang 編譯一些舊軟件時,我遇到了一些類似於以下的代碼:
class OuterClass {
private:
template <class T>
class InnerClass {};
};
template <class T>
class OtherClass {};
template <class T>
class OtherClass<OuterClass::InnerClass<T>> {};
我對這段代碼的理解是,模板 class OtherClass
專門用於私有內部模板 class OuterClass OuterClass::InnerClass
的實例化。
g++-10
(版本 10.2.0)似乎編譯此代碼沒有任何錯誤或警告,但clang++-10
(版本 10.0.0)在模板專業化中抱怨“ 'InnerClass' is a private member of 'OuterClass'
。
當然,我可以將InnerClass
公開,但是由於InnerClass
在原始代碼中是私有的,我認為這種解決方案並不理想。 有沒有一種方法可以讓OtherClass
InnerClass
專業化(也許巧妙地使用了friend
)?
我想也許我可以做這樣的事情,(這類似於對類似問題的回答中采用的方法,但我收到一個錯誤,指出“不能將部分專業化聲明為朋友”。
template <typename T>
friend class OtherClass<InnerClass<T>>;
發布的代碼似乎在gcc
下編譯,只是因為模板從未實際實例化(並且沒有生成代碼),但如果嘗試實例化它會失敗。
要使OtherClass<InnerClass<T>>
實例化工作,需要使模板類可以訪問內部類型。 一種方法是在OuterClass
中將它們聲明為公共類型。
#include <iostream>
template <class T>
class OtherClass;
class OuterClass {
private:
template <class T>
class InnerClass { };
public:
template <class T>
using OtherInner = OtherClass<InnerClass<T>>;
};
template <class T>
class OtherClass {
public:
OtherClass() { std::cout << "other<T>" << std::endl; }
};
template <class T>
class OtherClass<OuterClass::InnerClass<T>> {
public:
OtherClass() { std::cout << "other<inner>" << std::endl; }
};
int main() {
OtherClass<char> a; // output: other<T>
OuterClass::OtherInner<int> b; // output: other<inner>
// OtherClass<OuterClass::InnerClass<A>> c; // error: InnerClass is private
}
以上假設OuterClass
知道它想要向其公開InnerClass
的OtherClass
模板。 在上下文中可能是一個合理的假設,否則InnerClass
可以簡單地公開並可供所有其他類/模板不加選擇地訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.