Boost :: вариант и методы печати элементов в векторе - PullRequest
1 голос
/ 03 марта 2011
 std::vector< boost::variant<std::string, int> > vec;
 std::string s1("abacus");
 int i1 = 42;
 vec.push_back(s1);
 vec.push_back(i1);
 std::cout << vec.at(0).size() << "\n";

когда я пытаюсь запустить этот код, я получаю следующую ошибку:

main.cpp:68: error: ‘class boost::variant<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>’ has no member named ‘size’
make: *** [main.o] Error 1

однако, будучи строкой, он должен иметь метод size ().Я не уверен, что происходит не так.обратите внимание, что замена последней строки на:

std::cout << vec.at(0) << "\n";

выведет «abacus», как и ожидалось.

Ответы [ 2 ]

6 голосов
/ 03 марта 2011

строка, которая должна иметь метод size ()

Это не string - это variant. Сначала вы должны сообщить компилятору, что вы знаете , что внутри string - то есть получить его, используя boost::get<std::string>(vec[0]).

Обязательно прочитайте учебник Boost.Variant .

1 голос
/ 03 марта 2011

Вам необходимо получить первый тип этого варианта (который является строкой), класс boost::variant, к которому вы обращаетесь с помощью vector::at(), не имеет метода с именем size(), попробуйте что-то вроде ::

boost::get<0>(vec.at(0)).size(); // I think that's the syntax....
...