2011-10-14 124 views
1
#include "PQueue.h" 

struct arcT; 

struct coordT { 
    double x, y; 
}; 

struct nodeT { 
    string name; 
    coordT* coordinates; 
    PQueue<arcT *> outgoing_arcs; 
}; 

struct arcT { 
    nodeT* start, end; 
    int weight; 
}; 

int main(){ 
    nodeT* node = new nodeT; //gives error, there is no constructor 
} 

我的目的是在堆中创建一个新的nodeT。错误是:在结构体中使用'new'关键字在C++中

错误C2512:“NODET”:可用

+5

该代码没有任何问题 - “coordT”有一个隐式生成的构造函数,它什么都不做。你真的从该代码中得到错误吗?它究竟说什么? –

+0

错误C2512:'nodeT':没有适当的默认构造函数可用 – SegFault

+1

您有不同的问题。你提供的代码编译得很好(你是否声明了任何构造函数?)你可以尝试粘贴它到ideone或任何其他类似的页面来验证这一点。 –

回答

5

PQueue<arcT *>没有适当的默认构造函数没有合适的默认构造函数,所以不能由编译器生成nodeT默认构造函数。可以为PQueue<arcT *>创建适当的默认构造函数,或者为nodeT添加一个用户定义的默认构造函数,该构造函数适当地构造outgoing_arcs

4

如果问题中当前发布的代码是完全相同的副本,那么此错误的唯一可能原因是PQueue<…>未定义默认构造函数,而是定义了另一个构造函数。

否则这段代码会编译。

更准确地说,因为您没有为您的结构定义构造函数,所以C++会尝试自动生成它们。尽管如此,它只能做到这一点,只要它的所有成员变量都是适当的默认可构造或可初始化的。 std::string有一个默认构造函数,并且作为指针的coordT*可以被初始化。所以只有PQueue<…>仍然是罪魁祸首。

3

这可能不是你的问题,但你只宣布此行ARCT一个指针: -

nodeT* start, end; 

你已经宣布开始为指针,并最终作为实际NODET对象。这是你想要做的吗?

+0

好抓!我从来没有注意到... –

+0

不,这不是我想要做的,我希望他们两个都是指针,你为我节省了很多时间 – SegFault