簡體   English   中英

如何在模板專業化中使用私有內部模板 class 作為參數?

[英]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知道它想要向其公開InnerClassOtherClass模板。 在上下文中可能是一個合理的假設,否則InnerClass可以簡單地公開並可供所有其他類/模板不加選擇地訪問。

暫無
暫無

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

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