2012-02-23 80 views
1

请看下面的代码:益友所有模板类的其它模板类

template <typename T, int d> 
class Grid { 
    //Following line is what I need to change 
    template<int d2> friend class Iterator<T,d,d2>; 
} 

template <typename T, int d, int d2> 
class Iterator{ 
    //some code that use private fields of Grid<T,d> 
} 

template <typename T, int d> 
class Iterator<T,d,0>{ 
    //This specialized class also need to use private parts of Grid<T,d> 
} 

两个专业,而不是专门的迭代器应该获得的私处。 行:

template<int d2> friend class Iterator<T,d,d2>; 

没有错误编译:偏特`迭代器”声明朋友

有谁知道怎么更换呢?

编辑: 由于@Xeo评论我能够做出一个解决办法:

template<typename TT, int dd, int d2> friend class Iterator; 

但是这给朋友访问所有的迭代器模板不仅具有匹配第一和第二个模板参数的一个。

+0

如果你前瞻性声明'Iterator'定义'Grid'过吗?我认为''Iterator'的特定版本的'friend'声明可以工作。做一个类或非内联函数的'朋友'声明,这个项目的第一个声明似乎从未出现过正确的结果。 (我不知道你是否也必须提前声明'Iterator '。) – CTMacUser 2012-03-28 21:54:07

回答

1

这仅仅是一个解决方法,但它的工作:

template<typename TT, int dd, int d2> friend class Iterator;