在模板化嵌套和继承类中未检测到变量

时间:2012-12-19 23:57:58

标签: c++ class templates inheritance

我有一个嵌套和继承的结构。

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

你能不能告诉我为什么它看不到界限?

2 个答案:

答案 0 :(得分:4)

您需要说this->boundsOctree<U, T, _Prd>::bounds。在C ++中,当类模板继承自另一个类模板时,模板基类在第一次编译过程中未实例化,因此必须使用显式限定符访问继承的成员。

请参阅this answer以获得更详细的解释。

答案 1 :(得分:3)

依赖于模板参数的基类是非正式名称查找

您使用的是非限定名称bounds。基类Octree<U, T, _Prd>取决于模板参数。因此,编译器不会考虑基类的内容,并且找不到bounds

您可以通过多种方式解决它。

  1. 在引用bounds

    时使用限定名称
    Octree<U, T, _Prd>::bounds
    
  2. 通过bounds

    访问this->
    this->bounds
    
  3. 向派生类

    添加using bounds声明
    class OcHull: public Octree<U, T, _Prd>
    {    
      using Octree<U, T, _Prd>::bounds;
      ...