【发布时间】:2012-03-14 10:33:28
【问题描述】:
看下面的代码:
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;
但是,这使朋友可以访问所有迭代器模板,而不仅仅是那些具有匹配的第一个和第二个模板参数的模板。
【问题讨论】:
-
如果在定义
Grid之前先声明Iterator会怎样?我认为friend特定版本的Iterator声明将起作用。使类或非内联函数的friend声明成为该项目的第一个声明似乎永远不会完全正确。 (我不知道您是否还必须转发声明Iterator<T,d,0>。)