我正在尝试创建一个网格,据我了解,问题出在内部使用模板类自身的指针,这是合法的,直到我尝试对其进行处理时才出现编译器抱怨的问题。我正在寻找一种在模板自身内部使用指向模板类类的指针的方法,以用于使用指针,并在以后做我将要做的事情。我使用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
答案 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;