2017-11-02 11 views
1

私はこの状態でコンパイルするが、 "Call to pair is ambiguous"を与えるが、Clion IDEでのみ問題なくコンパイルでき、警告が消えてしまうコンパイラのエラーを引き起こしても、ランダムなものを追加してください。Clionによって "Call to pair ambiguous"とコードがコンパイルされる

std::pair<Status, std::set<std::string>> Config::foo(const std::string &sec, const std::string &key) const { 

    return std::pair<Status, std::set<std::string>>(
      hasSection(sec) ? (hasKey(sec, key) ? Status::Success 
               : Status::MissingKey) 
           : Status::MissingSec , 
     hasKey(sec, key) ? config_map.find(sec)->second.find(key)->second 
            : std::set<std::string>() 
     ); 
} 

私はそれをどのように修正するのか、実際問題が何であるかについてはわかりません。

答えて

0

ペアオブジェクトを作成する場合は、std :: make_pair関数テンプレートを使用する必要があります。

template <class T1, class T2> pair<V1,V2> make_pair (T1&& x, T2&& y);

テンプレートタイプは、暗黙的にmake_pairに渡される引数から推論することができます。

return std::make_pair(
     hasSection(sec) ? (hasKey(sec, key) ? Status::Success 
              : Status::MissingKey) 
          : Status::MissingSec , 
    hasKey(sec, key) ? config_map.find(sec)->second.find(key)->second : 
    std::set<std::string>() 
    ); 

このコードは、「呼び出しが曖昧です」を除いてコンパイルします。

make_pairテンプレートタイプを指定すると、「式はrvalueでなければなりません」というタイプのエラーが発生します。

+0

問題が実際に何であるかを明確にしてください – Welton122

+0

Zergのコードは正しいです、 "Call to pair is ambiguous"は本質的にClionのバグです。 std :: pairには初期化コンストラクタ_がありますので、 "std :: pair example(" example "、2);' "です。 std :: make_pairではなく、_r-value_と_move constructor_(および暗黙の変換)を使用してstd :: pairオブジェクトを構築します。 –

関連する問題