boost::gcc 的变体链接器错误

boost::variant linker error with gcc

本文关键字:链接 错误 gcc boost      更新时间:2023-10-16

我有点疯狂地试图弄清楚为什么以下内容无法编译:

#include <iostream>
#include <array>
#include <boost/variant.hpp>
#include <forward_list>
typedef unsigned long long very_long;
typedef boost::variant< int, std::string > variants_type;
typedef std::array< variants_type, 5 > row_type;
typedef std::forward_list<row_type> rows_holder_type;
int main() {
    rows_holder_type rows;
    row_type row_data;
    row_data[0] = 0;
    row_data[1] = 0;
    row_data[2] = 0;
    row_data[3] = 0;
    row_data[4] = 0;
    rows.push_front(row_data);
}

这是我得到的编译器错误:

/

usr/include/testing/test_code.o||在函数'std::array<boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_>, 5ul>::array(std::array<boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_>, 5ul> const&)' :|
商店.cpp:(.text._ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC2ERKS6_[_ZNSt5arrayIN5boost7variantIiSsNS0_6detail7variant5void_ES4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EELm5EEC5ERKS6_]+0x31)||对'boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_>::variant(boost::variant<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, 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_> const&)'的未定义引用 |
||=== 构建完成:1 个错误,0 个警告 ===|

如果我替换:

typedef boost::variant< int, std::string > variants_type;

跟:

typedef boost::any variants_type;

代码可以编译,但出于性能原因,我不想使用 boost::any。

我用 MSVC 和 gcc 4.7.0 测试了你的代码。MSVC编译并链接代码很好(当然是#include <string>),但是gcc在最后一行rows.push_front(row_data);给出了链接器错误。如果您注释掉该行,gcc 将接受代码。我认为 gcc 没有理由给出链接器错误,并得出结论,这是 gcc 的错误。gcc 的一种解决方法是将std::array更改为 std::vector

(从错误消息中,我假设您正在使用带有gcc的代码::块)

我已经消除了额外的代码,以下示例仍然给出链接器错误:

#include <boost/variant.hpp>
#include <array>
int main()
{
    std::array<boost::variant<int, double>, 5> row_type1;
    std::array<boost::variant<int, double>, 5> row_type2 = row_type1;
}

你缺少#include <string>;除此之外,你的代码很好。