为依赖模板类提供帮助

时间:2014-01-24 18:02:26

标签: c++ templates friend

我的代码中有一个案例,我需要将一个依赖模板类作为朋友,但我认为我已经用尽了可能性,但没有一个能够工作。这有可能吗?如果是这样,怎么样?

最简单的例子:

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;
}

4 个答案:

答案 0 :(得分:1)

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;
}

答案 1 :(得分:0)

尝试类似

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

在课堂内(example

答案 2 :(得分:0)

我能够在你的评论中插入它进行编译:

friend struct Traits::Foo<Bar>;

答案 3 :(得分:0)

老实说,你不会因为这样的事情而变得更好吗?

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;
}

允许包含公共typedef类型的任何东西比你的朋友更安全,尽管它很奇怪。