3

このようなネストされた継承された構造があります。

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 の境界変数にアクセスしたい場合、コンパイラはこの変数があることを認識しません。

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

境界が見えない理由を教えてください。

4

2 に答える 2

4

this->boundsまたはと言う必要がありますOctree<U, T, _Prd>::bounds。C++ では、クラス テンプレートが別のクラス テンプレートから継承する場合、テンプレートの基本クラスは最初のコンパイル パス中にインスタンス化されないため、継承されたメンバーには明示的な修飾子を使用してアクセスする必要があります。

より詳細な説明については、この回答を参照してください。

于 2012-12-20T00:21:24.687 に答える
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;
      ...
    
于 2012-12-20T00:24:02.657 に答える