我有一个嵌套和继承的结构。
template <typename U, typename T, typename _Prd = equal_to<T> >
class Octree
{
...
private :
BBox<T,3,_Prd> bounds ;
void SplitNode() ;
virtual bool isSplit () ;
...
};
template <typename U, typename T, typename _Prd = equal_to<T> >
class Hull
{
...
//nest the octree class here
class OcHull: public Octree<U, T, _Prd>
{
bool isSplit () ;
};
OcHull * GetOcHull() const ;
private:
OcHull * hullstructure ;
};
当我想访问OcHull中的bounds变量时,编译器看不到它有这个变量。
template <typename U, typename T, typename _Prd>
bool Hull<U,T,_Prd>::OcHull::isSplit()
{
assert(typeid(double) == typeid(T)) ;
// for each possible view of currect cell
for (size_t i = 0 ; i < camera_array.size() ; ++i)
{
//project centre of the cell
// bounds is not detected. bound is meant to be inherited from BBox<T,3,_Prd> bounds ; above
Vec<double,2> projectedP = camera_array[i].projectToCamPlane(bounds.centre) ;
...
}
}
错误是
Hull.hpp:84: error: ‘bounds’ was not declared in this scope
你能不能告诉我为什么它看不到界限?
答案 0 :(得分:4)
您需要说this->bounds
或Octree<U, T, _Prd>::bounds
。在C ++中,当类模板继承自另一个类模板时,模板基类在第一次编译过程中未实例化,因此必须使用显式限定符访问继承的成员。
请参阅this answer以获得更详细的解释。
答案 1 :(得分:3)
依赖于模板参数的基类是非正式名称查找 。
您使用的是非限定名称bounds
。基类Octree<U, T, _Prd>
取决于模板参数。因此,编译器不会考虑基类的内容,并且找不到bounds
。
您可以通过多种方式解决它。
在引用bounds
Octree<U, T, _Prd>::bounds
通过bounds
this->
this->bounds
向派生类
添加using
bounds
声明
class OcHull: public Octree<U, T, _Prd>
{
using Octree<U, T, _Prd>::bounds;
...