マークされたコンパイラエラー(C2899)が表示されるのはなぜですか?私はVS2010 SP1を試しました。私は私がstd::back_inserter(..)
とstd::copy(..)
を使用することができます知っている - それはポイントではありません。VS2010 SP1を使用した関数テンプレートのコンパイラエラー
#include <list>
#include <vector>
#include <algorithm>
template <typename source_container_type, typename target_container_type>
void copy_all(const source_container_type& source, target_container_type& target)
{
std::for_each(begin(source), end(source), [&] (const typename source_container_type::value_type& element)
{
// error C2899: typename cannot be used outside a template declaration
// error C2653: 'target_container_type' : is not a class or namespace name
target.push_back(typename target_container_type::value_type(element));
});
}
int main()
{
std::vector<int> a;
a.push_back(23);
a.push_back(24);
a.push_back(25);
std::list<int> b;
copy_all(a, b);
}
種類は
サイモン
PSについて。質問がperrealでコメントに答えた
EDIT
: http://connect.microsoft.com/VisualStudio/feedback/details/694857/bug-in-lambda-expressions
EDIT
私は回避策に興味がないんだということに注意してください。上記のコードがコンパイルされるべきかどうかを知りたい
これはバグのようです:http://connect.microsoft.com/VisualStudio/feedback/details/694857/bug-in-lambda-expressionsあなたのコードはg ++ 4.6.2で動作します – perreal
ラムダはここで何らかの役割を持っています。 –
問題のある型をtypedefすると役に立ちます。 'typedef typename target_container_type :: value_type target_vt; [...] target.push_back(target_vt(element)); 'が動作します。 –