Использование нового ключевого слова со структурой в C ++ - PullRequest
1 голос
/ 14 октября 2011
#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 в куче. Ошибка:

ошибка C2512: 'nodeT': нет подходящего конструктора по умолчанию

Ответы [ 3 ]

5 голосов
/ 14 октября 2011

PQueue<arcT *> не имеет соответствующего конструктора по умолчанию, поэтому компилятор не может сгенерировать конструктор по умолчанию для nodeT.Либо создайте соответствующий конструктор по умолчанию для PQueue<arcT *>, либо добавьте пользовательский конструктор по умолчанию для nodeT, который соответственно создаст outgoing_arcs.

4 голосов
/ 14 октября 2011

Если опубликованный в данный момент код в вопросе является точной копией, то единственной возможной причиной этой ошибки является то, что PQueue<…> не определяет конструктор по умолчанию и вместо него определяет другой конструктор.

В противном случае этот код скомпилируется.

Точнее, поскольку вы не определили конструктор для своих структур, C ++ пытается автоматически сгенерировать их. Тем не менее, он может делать это только при условии, что все его переменные-члены по умолчанию являются конструируемыми или инициализируемыми. std::string имеет конструктор по умолчанию, и coordT*, будучи указателем, может быть инициализирован. Таким образом, только PQueue<…> остается виновником.

3 голосов
/ 14 октября 2011

Это может не быть вашей проблемой, но вы объявили только один указатель на эту строку в arcT: -

nodeT* start, end;

Вы объявили начало как указатель и конец как фактический объект nodeT.Это то, что вы хотели сделать?

...