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)||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&)'|
||=== ビルドが終了しました: 1 エラー、0 警告 ===|

私が交換した場合:

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

と:

typedef boost::any variants_type;

コードはコンパイルされますが、パフォーマンス上の理由から boost::any を使用したくありません。

4

2 に答える 2

2

あなたのコードを MSVC と gcc 4.7.0 でテストしました。MSVC はコードを正常にコンパイルしてリンクしますが (もちろん を使用#include <string>)、gcc は最後の行でリンカー エラーを返しますrows.push_front(row_data);。その行をコメントアウトすると、gcc はコードを受け入れます。gcc でリンカ エラーが発生する理由がわかりません。これは gcc のバグであると結論付けています。gcc での 1 つの回避策は、に変更std::arrayすることstd::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;
}
于 2012-06-29T22:19:54.467 に答える
0

あなたは行方不明#include <string>です; それ以外は、コードは問題ありません。

于 2012-06-29T21:50:24.797 に答える