Ошибка компилятора в шаблоне функций с VS2010 SP1 - PullRequest
3 голосов
/ 27 февраля 2012

Почему я получаю отмеченную ошибку компилятора (C2899)?Я пробовал с 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);
}

С уважением
Simon

PS: я знаю, что могу использовать std::copy(..) с std::back_inserter(..) - но это не главное.

РЕДАКТИРОВАТЬ

На вопрос ответил в комментарии perreal: http://connect.microsoft.com/VisualStudio/feedback/details/694857/bug-in-lambda-expressions

РЕДАКТИРОВАТЬ

Пожалуйстаобратите внимание, что меня не интересуют обходные пути.Я хочу знать, должен ли скомпилированный код выше или нет.

Ответы [ 4 ]

1 голос
/ 27 февраля 2012

Извините, VS2010 не доступен. Попробуйте переместить typedef за пределы лямбды. Работает на g ++.

#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) 
 {
    typedef typename target_container_type::value_type TargetType; /// Code change here.

    std::for_each(source.begin(), source.end(), [&] (const typename source_container_type::value_type& element) 
    { 
         target.push_back(TargetType(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); 
} 
1 голос
/ 27 февраля 2012

Ваша строка действительна: http://ideone.com/qAF7r

Даже древний g ++ 4.3 компилирует его. Так что это, вероятно, ошибка в вашем компиляторе MS.

0 голосов
/ 27 февраля 2012

Поскольку вы используете C ++ 0x / 11, вы можете использовать:

target.push_back( (decltype(element))(element)); 
0 голосов
/ 27 февраля 2012

Я, возможно, неправильно понимаю, чего вы пытаетесь достичь, но разве не следует говорить о такой строке:

target.push_back (элемент);

...