0

私はini ファイルを読むためにboost::property_tree::ptreeandを使用しています。parse_ini使用ptree::iterator方法 ini セクションを取得していて、それらを使用して別のオブジェクトを作成したいと考えています。

First取得するというオブジェクトがありますFirst(int& i, string& str)

そのため、たとえば ptree 関数から取得した戻り値を使用して、そのような新しいオブジェクトを構築しようとしています ( posisionis my 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&

助けや説明をいただければ幸いです。

ありがとう !

4

1 に答える 1

2

問題は、引数が左辺値参照として入力されている場合、右辺値を渡すことができないことです。例えば

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);
于 2014-11-20T02:36:13.727 に答える