c++ - gcc 的 boost::variant 链接器错误

标签 c++ gcc boost c++11 boost-variant

我有点发疯了,想弄清楚为什么以下代码无法编译:

#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||In function '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)||undefined reference to '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&)'|
||=== Build finished: 1 errors, 0 warnings ===|

如果我替换:

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::arraystd::vector .

(根据错误消息,我假设您正在使用带有 gcc 的 Code::Blocks)

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

#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;
}

关于c++ - gcc 的 boost::variant 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11269179/

相关文章:

c++ - 强制 recv (Windows C++) 函数阻塞,直到读取 N 个字节

c++ - 是否可以将 gcc 的链接器与 dlopen 结合使用?

android - Gcc 可以构建可执行程序吗?

c++ - 在 C++ 项目的 XCODE 中使用 MySQL

c++ - boost program_options : using zero-parameter options multiple times?

c++ - 如何解释我在源代码中找到的这个 C++ 类声明?

c++ - 使用 tcmalloc - 如何正确加载 malloc 扩展?

c++ - 了解 GCC 5 的 _GLIBCXX_USE_CXX11_ABI 或新的 ABI

c++ - 为什么我的 C++ 链接器仅在删除 boost 共享目标文件后才起作用?

c++ - (如何)我可以在 Centos/RHEL 上使用新的 C++ 11 ABI 和 devtoolset-7 吗?