c++模板没有合适的默认构造函数
c++ template no appropriate default constructor
可能重复:
为什么模板类的实现和声明应该在同一个头文件中?
希望你能帮我。
我知道这个问题(在谷歌搜索后)已经被问了数百万次了。我确信我的问题的解决方案就在那数百万个问题中的一个,但我找不到,所以我决定问。
我得到这个错误特别:
错误1错误C2512:"NodeQueue":没有合适的默认构造函数可用,例如:\work\fast\semi 5\automation\assignments\progass1\progas1\tree.h 33 1 progas1
特定行具有以下定义:
level=new NodeQueue<Node>;
下一行也会出现同样的错误,但原因相同。。
我对所有事情都有默认的构造函数,不确定为什么会发生这种情况。。以下是部分代码:
头文件的顶部:
#include <iostream>
using namespace std;
#include "intarr.h"
class Node;
template <typename t>
class QueueNode;
template <typename t>
class NodeQueue;
树:
class Tree{
Node* root;
int level_length;
Node* curr;
NodeQueue <Node>* level,*level_bak;
public:
Tree(){
root=NULL;
level_length=0;
curr=NULL;
level=new NodeQueue<Node>;
level_bak=new NodeQueue<Node>;
}
// I doubt you need the rest...
类节点
class Node{
public:
Node *top,*right,*bottom,*left,*prev;
Node *a,*b,*c;
int row,col;
Node(){
}
Node(int x,int y){
top=right=bottom=left=prev=NULL;
row=x;col=y;
a=b=c=NULL;
}
};
队列节点(即队列的节点)
template <typename t>
class QueueNode {
public:
QueueNode* next;
QueueNode* prev;
t *value;
QueueNode(){
}
QueueNode(t* value){
next=NULL;
this->value=value;
}
};
节点队列:
template <typename t>
class NodeQueue {
QueueNode *head;
QueueNode *tail;
//lhs=bottom;
public:
NodeQueue(){
head=NULL;
tail=NULL;
}
//....... rest of the code you dont need
由于这是一个编译器错误(而不是链接器,就像大多数模板错误问题一样),我猜这是因为您转发声明了类型:
template <typename t>
class NodeQueue;
为什么转发声明而不包括文件?要构造一个对象,您需要完整的定义,所以#include "NodeQueue.h"
在不需要完整类型的地方使用正向声明。
根据MSDN编译器的说法,当您试图创建未完全前向声明但完整定义不可用的类实例时,也会生成错误C2512。
因此,您需要将NodeQueue
定义标头包含到tree.h
中。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数