使用gcc编译时出现boost::variant链接错误

4

我正在疯狂地尝试弄清楚为什么下面的代码无法编译:

#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&)' 中:|
store.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。

4
它确实编译了,但出现了链接器错误。 - hmjd
有什么建议可以修复它吗?我正在搜索如何解决链接器错误,但还没有找到解决方案。 - user396404
抱歉,我从未使用过 boost::variant。许多 boost 库都是头文件库,因此无需链接任何内容,但并非全部如此。例如 boost::regex 就需要构建一个库,然后将其链接起来。 - hmjd
boost::variant 也是一个仅包含头文件的库。 - ildjarn
1
我猜测链接器错误是因为boost::variant不是一个“完整类型”,而std::array(像大多数标准库头文件一样)需要完整类型。 - A. K.
1
@Aditya:在这里,boost::variant<> 怎么可能 不是 完整类型呢? - ildjarn
2个回答

2
我使用MSVC和gcc 4.7.0测试了你的代码。MSVC编译和链接代码正常(当然需要包含#include <string>),但是gcc在最后一行rows.push_front(row_data); 给出链接器错误。如果您将该行注释掉,则gcc接受此代码。我看不出为什么gcc会给出链接器错误,并且得出结论这是gcc的一个bug。在gcc上的一个解决方法是将std::array更改为std::vector

(从错误消息中可以推断出您正在使用Code :: Blocks与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;
}

这真的很奇怪。我敢肯定我以前在数组中使用过类似的东西。目前为止,你的向量“修复”是有效的。 - user396404
Clang 3.1没有问题生成可链接的输出。 - Managu
我将把这个标记为正确答案,因为它确实“修复”了编译错误。但是,我仍然认为必须有一些方法来解决这个问题。 - user396404

0

你缺少了#include <string>,除此之外你的代码没问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接