簡體   English   中英

友好的依賴模板類

[英]Friending a dependent template class

我的代碼中有一個案例,需要讓一個依賴的模板類成為朋友,但我認為我已經窮盡了所有可能性,但沒有一種可行。 這有可能嗎? 如果是這樣,怎么辦?

最簡單的例子:

struct Traits {
    template <typename T>
    struct Foo {
        typedef typename T::bar* type;
    };
};

template <typename T>
class Bar
{
    typedef int bar;
    // need to make T::Foo<Bar> a friend somehow?
    typedef typename T::template Foo<Bar>::type type; // won't compile because bar is private... 
                                                      // suppose I cannot make bar public.


    type val;
};

int main() {
    Bar<Traits> b;
}
struct Traits {
    template <typename T>
    struct Foo {
        typedef typename T::bar* type;
    };
};

template <typename T>
class Bar
{
    typedef int bar;
    friend typename T::template Foo<Bar>;
    typedef typename T::template Foo<Bar>::type type;
    type val;
};

int main() {
    Bar<Traits> b;
}

嘗試類似

using my_friend=typename T::template Foo<Bar>;
friend my_friend;

在您的班級內部( 示例

在您發表評論時,我可以用插入的代碼進行編譯:

friend struct Traits::Foo<Bar>;

老實說,這樣您會不會變得更好?

template <typename T>
class Bar;

struct Traits
{
public:
  template <typename T>
  struct Foo
  {
    typedef Bar<T> bar_type;
    typedef typename bar_type::bar* type;
  };
};

template <typename T>
class Bar
{
  typedef int bar;
  typedef Bar self_type;
  typedef struct Traits::template Foo<T> traits_type;

  friend traits_type;

  typedef typename traits_type::type type;

  type val;
};


int main(int argc,char** argv)
{
  Bar<Traits> b;
}

這比允許所有包含public typedef類型的東西成為您的朋友要安全得多,盡管這很奇怪。

暫無
暫無

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

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