compiler error: no appropriate default constructor available
От: Bender Bending Rodriguez Россия  
Дата: 02.04.10 13:04
Оценка:
Всем привет!

минимальный код вызывающий ошибку:


#include <vector>
#include <utility>

class A
{
public:
    A(const int i):m(i){}

private:
    int m;
};

int main()
{
    typedef std::pair< A, std::vector< int > > pair_t;
    typedef std::vector< pair_t > vector_t;

    vector_t vector;

    pair_t el(A(5), std::vector< int >(5, 5));
    vector.push_back(el);

    return 0;
}


MS VisualStudio 2008 выдаёт следующее сообщение:

error C2512: 'A::A' : no appropriate default constructor available


MS VisualStudio 2005 компилирует без проблем. Как и Comeau on-line, codepad.org

Интересное наблюдение: если изменить pair_t с

    typedef std::pair< A, std::vector< int > > pair_t;

на
    typedef std::pair< A, A > pair_t;

то такая конструкция уже не требует default constructor A()

С "наскоку" видна разница в реализации vector::_Insert_n()
ошибка же сама "возникает" в <memory>

template<class _InIt, class _FwdIt, class _Alloc>
inline    _FwdIt _Uninit_move(
    {    // use swap to instead of the copy constructor
        ...

    // empty value used in the construction
    typename _Alloc::value_type _Val;
        ...
        }


но с какого перепуга мы сюда вообще попадаем, мне пока неочевидно

Буду благодарен за идеи и рецепты!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.