使用模板内的类的指针的c ++模板不完整类型

时间:2019-01-28 12:08:24

标签: c++ c++11 templates pointers compilation

我正在尝试创建一个网格,据我了解,问题出在内部使用模板类自身的指针,这是合法的,直到我尝试对其进行处理时才出现编译器抱怨的问题。我正在寻找一种在模板自身内部使用指向模板类类的指针的方法,以用于使用指针,并在以后做我将要做的事情。我使用g ++版本5进行编译,我使用的编译命令是g ++ * .cpp -o main -std = c ++ 11我收到的错误将遵循代码段。

struct Vector2D 
{
    Vector2D(  ) {  }
    Vector2D( int x , int y ): x( x ) , y( y ) {  } ;

    int x , y ; 

} ;

template <typename A>
class GridNode2D ; 

template <typename T>
class GridNode2D
{
public: 
    GridNode2D(  ) {  } ;
    T data ; 
    Vector2D coOrdinate ; 

    GridNode2D<T>* left, right, up, down ; 

} ;

template <typename T>
class Grid2D
{
public:
    Grid2D(  ) ;

    GridNode2D<T>* head ; 

} ;

template <typename T>
Grid2D<T>::Grid2D(  )
{
    this->head = new GridNode2D<T> ; 
    this->head->right = new GridNode2D<T> ; 

} ;

错误:

main.cpp: In instantiation of ‘class GridNode2D<bool>’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',39)">main.cpp:39:16</span>:   required from ‘Grid2D<T>::Grid2D() [with T = bool]’
<span class="error_line" onclick="ide.gotoLine('main.cpp',47)">main.cpp:47:18</span>:   required from here
main.cpp:22:26: error: ‘GridNode2D::right’ has incomplete type
     GridNode2D<T>* left, right, up, down ; 
                          ^
main.cpp:15:7: note: definition of ‘class GridNode2D’ is not complete until the closing brace
 class GridNode2D
       ^
main.cpp:22:33: error: ‘GridNode2D::up’ has incomplete type
     GridNode2D<T>* left, right, up, down ; 
                                 ^
main.cpp:15:7: note: definition of ‘class GridNode2D’ is not complete until the closing brace
 class GridNode2D
       ^
main.cpp:22:37: error: ‘GridNode2D::down’ has incomplete type
     GridNode2D<T>* left, right, up, down ; 
                                     ^
main.cpp:15:7: note: definition of ‘class GridNode2D’ is not complete until the closing brace
 class GridNode2D

2 个答案:

答案 0 :(得分:2)

星号*在声明中的位置

GridNode2D<T>* left, right, up, down ;

具有误导性。 “标准” C声明方式将使其更加清晰:

GridNode2D<T> *left, right, up, down ;

在上面,更清楚的是星号属于left的声明,而这就是您遇到的问题:您仅将left声明为指针,而不声明其他变量。

由于其他变量不是指针,因此需要完整定义GridNode2D<T>才能定义该类的实例,但这是不可能的,因为对象是GridNode2D<T>本身的一部分。导致您得到错误。

或者在声明中的所有变量上使用星号,或者为了更好的可读性,将声明分成多行:

GridNode2D<T>* left;
GridNode2D<T>* right;
GridNode2D<T>* up;
GridNode2D<T>* down;

答案 1 :(得分:1)

声明

GridNode2D<T>* left, right, up, down ;

创建1个指针和3个实例。 更改为

GridNode2D<T>* left, *right, *up, *down;

甚至

GridNode2D<T>* left = nullptr;
GridNode2D<T>* right = nullptr;
GridNode2D<T>* up = nullptr;
GridNode2D<T>* down = nullptr;