C++のSTLコンテナメンバ変数の初期化 (再び)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
chibago

C++のSTLコンテナメンバ変数の初期化 (再び)

#1

投稿記事 by chibago » 14年前

同タイトルのスレッドを解決としてしまったため、
別スレッドを立ち上げております。
うしおさん、a5uaさんから頂いたサンプルを動かしてみて
要件を満たしたと思ったのですが、微妙に問題が解決できて
おりませんでした。

私の環境はgcc-4.6.0ですが、a5uaさんのご指摘のとおり、
static_castをしないとエラーになってしまいます。
そこで、a5uaさんのstatic_castの例をベースにうしおさん
におしえていただいた、2次元vectorの初期化方法をあわせて
実装いたしました。

コード:

#include <vector>
#include <iostream>
#include <boost/assign.hpp>
 
template <typename T>
void print_vector(const std::vector<std::vector<T> > &v)
{
    std::cout << "[" << v.size() << "]" << std::endl;
    for (int i = 0, N = v.size(); i < N; ++i) {
        std::cout << v[i][0] << std::endl;
    }
}
 
class test
{
public:
  test() : v(static_cast<const std::vector<std::vector<int> > &>
	   (boost::assign::list_of(boost::assign::list_of(1)(2)(3))
	                          (boost::assign::list_of(1)(2)(3))) )
    {
        print_vector(v);
    }
private:
  const std::vector<std::vector<int> > v;
};
 
int main()
{
    test();
}

ですが、これだと以下のようなエラー(主要部分の抜粋)
が出てコンパイルができません。

test2.cpp:19:61: instantiated from here
/usr/lib/gcc/i686-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_construct.h:84:7: エラー: オーバーロードされた ‘vector(const boost::assign_detail::generic_list<int>&)’ の呼び出しは曖昧です

凡みすでしたら済みませんが、
ご指導いただければ幸です。

アバター
a5ua
記事: 199
登録日時: 14年前

Re: C++のSTLコンテナメンバ変数の初期化 (再び)

#2

投稿記事 by a5ua » 14年前

キャストがとんでもなく煩雑ですが、こんな感じでしょうか

コード:

#include <vector>
#include <iostream>
#include <boost/assign.hpp>
 
template <typename T>
void print_vector(const std::vector<std::vector<T> > &v)
{
	std::cout << "[" << v.size() << "]" << std::endl;
	for (int i = 0, N = v.size(); i < N; ++i) {
		std::cout << v[i][0] << std::endl;
	}
}

class test
{
public:
	test()
		: v(static_cast<const std::vector<std::vector<int> > &>(boost::assign::list_of
				( static_cast<const std::vector<int> &>(boost::assign::list_of(1)(2)(3)) )
				( static_cast<const std::vector<int> &>(boost::assign::list_of(1)(2)(3)) )
			))
	{
		print_vector(v);
	}
private:
	const std::vector<std::vector<int> > v;
};

int main()
{
	test();
}
ところで、gcc-4.6.0であれば、initializer_listによる初期化が使えると思うのですが、いかがでしょうか?
(ただし、コンパイルオプションで、-std=c++0xとかが必要だったはず)
initializer_listについては、以下などを参照してください
http://d.hatena.ne.jp/faith_and_brave/2 ... 1190380809

コード:

#include <vector>
#include <iostream>
#include <boost/assign.hpp>
 
template <typename T>
void print_vector(const std::vector<std::vector<T> > &v)
{
	std::cout << "[" << v.size() << "]" << std::endl;
	for (int i = 0, N = v.size(); i < N; ++i) {
		std::cout << v[i][0] << std::endl;
	}
}

class test
{
public:
	test() : v{{1, 2, 3}, {1, 2, 3}}
	{
		print_vector(v);
	}
private:
	const std::vector< std::vector<int> > v;
};

int main()
{
	test();
}

chibago

Re: C++のSTLコンテナメンバ変数の初期化 (再び)

#3

投稿記事 by chibago » 14年前

a5uaさん、
ありがとうございました。
私の環境での動作が確認できました。

initialize_listは便利ですね。
ただ、可搬性を考えるとstatic_castにしておいた方が
無難そうですね。
(そのうち、オプションなしでinitialize_listが使えるようになるのでしょうか)

ご指導頂いた内容を活用させていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る