variable not detected in a templated nested and in

2019-02-19 04:29发布

I have a nested and inherited structure like this.

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 ;

};

And when I want to visit the bounds variable in OcHull, compiler doesn't see it has this variable.

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

        ...


    }
}

Error is

Hull.hpp:84: error: ‘bounds’ was not declared in this scope

Could you please tell me why it doesn't see bounds ?

2条回答
Deceive 欺骗
2楼-- · 2019-02-19 05:12

You need to say this->bounds or Octree<U, T, _Prd>::bounds. In C++, when a class template inherits from another class template, the template base class is not instantiated during the first compilation pass, so the inherited members must be accessed with an explicit qualifier.

See this answer for a more elaborate explanation.

查看更多
ゆ 、 Hurt°
3楼-- · 2019-02-19 05:28

Base classes that depend on template parameters are not considered by unqualified name lookup.

You are using unqualified name bounds. And the base class Octree<U, T, _Prd> depends on template parameters. So, the contents of the base class is not considered by the compiler and bounds is not found.

You can solve it in several ways.

  1. Use a qualified name when referring to bounds

    Octree<U, T, _Prd>::bounds
    
  2. Access bounds through this->

    this->bounds
    
  3. Add a using declaration of bounds to the derived class

    class OcHull: public Octree<U, T, _Prd>
    {    
      using Octree<U, T, _Prd>::bounds;
      ...
    
查看更多
登录 后发表回答