перегрузка — c ++ libconfig неоднозначная перегрузка

Я собираюсь скомпилировать довольно простой ‘Hello, world’, используя libconfig. Но когда я компилирую такой код:

#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>]

1

Решение

В соответствии с Глава 4 документации, на странице 19, lookup возвращает Setting&, а не строка.

Теперь, согласно странице 20, Setting имеет множество неявных преобразований в различные типы, в том числе std::string, Здесь преобразование в std::string является неоднозначным в присутствии преобразования в const char*, поскольку std::string имеет конструкторов, принимающих оба с равным рангом.

Эта проблема на самом деле подробно описана на странице 21, где предлагается разрешить неоднозначность с явным преобразованием (или «приведением») или использованием члена c_str() а не операторов преобразования:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]