decltypeで取得した型内のネストした型を使う方法
hoge
bar; // みたいな宣言がg++でコンパイル通らんことが分かったが、かと言って対処法があるわけではなし…
http://twitter.com/tanakh/statuses/4342143438
これを回避しようとして,decltypeで取得した型の内側で定義されている型に言及しようとすると,g++に怒られます.
ので,テンプレートを仲介してみたらあっさり通りました.*1多分work-aroundだと思うです.
これでC++0xの機能のみで目的が達成出来ました :-)
g++ 4.4.0で動作確認.
#include <iostream> #include <string> #include <vector> #include <iterator> using namespace std; template< typename T > struct type_holder { typedef T type; }; int main(){ typedef vector<int> Vec; Vec v; //back_insert_iterator<Vec> bit = back_inserter(v); back_insert_iterator< decltype(v) > bit = back_inserter(v); // 重要!! vector< type_holder<decltype(v)>::type::value_type > v2; // vector< decltype(v)::type::value_type > v2; // Error ;( // 一応確認で… for(int i=0; i<5; i++){ *bit = i; } copy(v.begin(), v.end(), back_inserter(v2)); for(Vec::const_iterator it=v.begin(); it!=v.end(); ++it){ cout << *it << ","; } cout << endl; for(Vec::const_iterator it=v2.begin(); it!=v2.end(); ++it){ cout << *it << ","; } cout << endl; return (0); } // main //> 0,1,2,3,4, //> 0,1,2,3,4, v( ̄Д ̄)v
http://codepad.org/は0x対応してなくてエラー出るのぅ…
*1:名前はtype2typeの方が良かったかも