我正在使用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 :(得分:2)
问题是你不能传递r值,其中参数被输入为l值引用。 E.g。
void foo(int& x)
{
x = 2;
}
int main(void)
{
foo(5); // won't compile; can't pass r-value to reference parameter
}
如果这是有效的,我们将值2分配给值5,这是无意义的。如果可能,你可以声明第一个构造函数来获取const引用(不确定这是否适用于你,因为你没有发布代码):
First(const int& i, const string& str);
虽然对于基元,最好只传递值而不是const引用:
First(int i, const string& str)
如果你需要它们是非const引用(闻起来像一个糟糕的设计),你可以这样做:
int i = boost::lexical_cast<int>((posision->second).get<int>("number"));
string str((posision->second).get<string>("name"));
First* one = new First(i, str);