1

libconfig を使用して、非常に簡単な 'Hello, world' をコンパイルしようとしています。しかし、そのようなコードをコンパイルすると:

#include <iostream>
#include <libconfig.h++>

libconfig::Config cfg;

std::string target = "World";

int main(void)
{
    try
    {
        cfg.readFile("greetings.cfg");
    }
    catch (const libconfig::FileIOException &fioex)
    {
        std::cerr << "I/O error while reading file." << std::endl;
        return 1;
    }
    catch (const libconfig::ParseException &pex)
    {
        std::cerr << pex.getFile() << " " << pex.getLine()
              << ": " << pex.getError() << std::endl;
        return 1;
    }

    try
    {
        target = cfg.lookup("target");
    }
    catch (const libconfig::SettingNotFoundException &nfex)
    {
        std::cerr << "No target set in configuration file. Using default." << std::endl;
    }

    std::cout << "Hello, " << target << "!" << std::endl;   

    return 0;
}

このエラーがあります:

example1.cpp: In function 'int main()':
example1.cpp:28: error: ambiguous overload for 'operator=' in 'target = cfg.libconfig::Config::lookup(((const char*)"target"))

/usr/include/c++/4.2/bits/basic_string.h:490: note: candidates are: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/include/c++/4.2/bits/basic_string.h:498: note:                 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/include/c++/4.2/bits/basic_string.h:509: note:                 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
4

1 に答える 1

7

ドキュメントの第 4 章によると、19 ページで、文字列ではなく をlookup返しSetting&ます。

現在、20ページによるとSetting、 を含むさまざまな型への暗黙的な変換がたくさんありstd::stringます。ここで、 への変換は、 へstd::stringの変換が存在する場合にはあいまいです。これは、同じランクで両方を受け入れるコンストラクターがconst char*あるためです。std::string

この問題は実際には21ページで明示的に説明されており、明示的な変換(または「キャスト」)であいまいさを解決するかc_str()、変換演算子ではなくメンバーを使用することが提案されています。

target = cfg.lookup("target").c_str();
于 2013-12-23T13:49:41.330 に答える