C++ libconfig 模棱两可的重载



我即将使用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 章,在第 19 页,lookup 返回一个Setting&,而不是一个字符串。

现在,根据第 20 页,Setting 有一堆隐式转换为各种类型的,包括 std::string .在这里,在转换为const char*的情况下,转换为std::string是模棱两可的,因为std::string构造函数接受两者的等级相等。

这个问题实际上在第 21 页有明确描述,其中建议使用显式转换(或"强制转换")来解决歧义,或者使用成员c_str()而不是转换运算符:

target = cfg.lookup("target").c_str();

最新更新