я использую 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&
буду признателен за любую помощь или объяснение.
Спасибо !
Проблема в том, что вы не можете передавать 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);