ошибка компилятора shared_ptr неверное преобразование

У меня есть класс под названием State который имеет shared_ptr, weak_ptr и int как его поля. У меня также есть другой класс под названием Automata который имеет shared_ptr в состояние. я использую State подражать государству в NFA. Automata является связанным списком государств в NFA. И государства связаны с shared_ptrСамостоятельная петля обозначена weak_ptr,

class State {
public:
// ptr to next state
std::shared_ptr<State> nextState;
// ptr to self
std::weak_ptr<State> selfLoop;
// char
int regex;
// Constructor
State(const int c) : regex(c){}
// Destructor
~State();
};
#define START 256

#define FINAL 257

class Automata {
private:
std::shared_ptr<State> start;
public:
// Constructor, string should not be empty
Automata(const std::string &str);
// Destructor
~Automata();
// Determine a string matched regex
bool match(const std::string &str);
};

Конструктор Automata в основном принимает регулярное выражение и преобразовывает его в NFA. (Это работает! Посмотрите это, если вы заинтересованы: https://swtch.com/~rsc/regexp/regexp1.html)

Ошибка компиляции происходит при компиляции Automataконструктор. Это реализовано следующим образом

Automata::Automata(const string &str) {
start = make_shared<State>(new State(START)); // Error is here, START defined above
for (loop traversing str) {
//add more states to start
}
}

Я получил сообщение об ошибке

// A lot gibbrish above
Automata.cc:7:45:   required from here
/usr/include/c++/4.8/ext/new_allocator.h:120:4: error: invalid conversion
from ‘State*’ to ‘int’ [-fpermissive]
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^
In file included from Automata.h:4:0,
from Automata.cc:2:
State.h:18:2: error:   initializing argument 1 of ‘State::State(int)’ [-fpermissive]
State(const int c);
^

Не уверен, что я сделал не так. Я совершенно новичок в shared_ptr, так что я понятия не имею, если это проблема make_shared или ошибка с State конструктор? Можете ли вы помочь мне исправить это?

0

Решение

Разве ты не хотел писать:

Automata::Automata(const string &str) {
start = make_shared<State>(START); // make_shared will call new internally
for (loop traversing str) {
//add more states to start
}
}

?

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]