Использование возвращаемого значения для передачи в конструктор не работает

я использую boost::property_tree::ptree а также parse_ini читать INI-файл. С помощью ptree::iterator Я получаю разделы ini и хочу использовать их для создания другого объекта.

У меня есть объект под названием First что получает First(int& i, string& str)

Поэтому я пытаюсь создать новый объект, например, используя возвращаемые значения, которые я получаю из функций ptree, например (posision мой ptree::iterator)

First* one = new First(
boost::lexical_cast<int>((posision->second).get<int>("number")),
(posision->second).get<string>("name")
);

но я получаю

no matching function for call to ‘First::First(int, std::basic_string<char>)’

поэтому я попробовал кастинг так:

First* one = new First(
(int&) boost::lexical_cast<int>((posision->second).get<int>("number")),
(string&) (posision->second).get<string>("name")
);

но потом я получил

invalid cast of an rvalue expression of type ‘int’ to type ‘int&’

а также

invalid cast of an rvalue expression of type ‘std::basic_string<char>’ to type ‘std::string&

буду признателен за любую помощь или объяснение.

Спасибо !

0

Решение

Проблема в том, что вы не можете передавать r-значения, когда аргумент вводится как ссылка на l-значение. Например.

void foo(int& x)
{
x = 2;
}

int main(void)
{
foo(5); // won't compile; can't pass r-value to reference parameter
}

Если бы это было верно, мы бы присвоили значение 2 значению 5, что является бессмысленным. Если это возможно, вы можете объявить конструктор First для получения константных ссылок (не уверен, что это работает для вас, поскольку вы не опубликовали код):

First(const int& i, const string& str);

Хотя для примитивов лучше просто передать в качестве значения вместо константной ссылки:

First(int i, const string& str)

Если вы хотите, чтобы они были неконстантными ссылками (которые пахнут как плохой дизайн), вы можете сделать:

int i = boost::lexical_cast<int>((posision->second).get<int>("number"));
string str((posision->second).get<string>("name"));
First* one = new First(i, str);
2

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


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