Абстрактный класс, unique_ptr и std::set (VS 2012)
От: dummii_02  
Дата: 12.09.13 08:20
Оценка:
Добрый день коллеги,
прошу помощи, потому как сам к сожалению не могу понять.

вопрос: КАК ПРАВИЛЬНО ОРГАНИЗОВАТЬ СТРУКТУРУ КЛАССОВ ДЛЯ ТАКОГО СЛУЧАЯ.

Имеется:
class AIDummy
{
public:
    virtual bool
        getValue() const = 0;
     virtual ~AIDummy() {}
};
typedef AIDummy*        AIDummyPtr;

class CDummy : public AIDummy
{
public:
    bool     getValue() const { return m_Value; }
     CDummy( bool AValue ) : m_Value(AValue) { std::wcout << L"create CDummy" <<  m_Value << endl; }
     CDummy() : m_Value(false) { std::wcout << L"create default CDummy" <<  m_Value << endl; }
     ~CDummy() { std::wcout << L"destory CDummy" <<  m_Value << endl; }
private:
     bool    m_Value;
private:
     CDummy( const CDummy& );
     CDummy& operator= ( const  CDummy& );
};
typedef std::unique_ptr<AIDummy>    TDDummyUPtr;

struct     AIDummyLess{
    bool operator() (const TDDummyUPtr AFirst
            , const TDDummyUPtr ASecond )
    {
        std::less<bool> op;
        return op( AFirst->getValue(), ASecond->getValue() );
    }
};

typedef std::set<TDDummyUPtr, AIDummyLess>    TDDummySet;

int _tmain(int argc, _TCHAR* argv[])
{
    TDDummySet    DummySet;
    DummySet.insert( TDDummyUPtr(new CDummy()) );
    DummySet.insert( TDDummyUPtr(new CDummy(false)) );
    DummySet.clear();
}

на стадии компиляции получаю множественные ошибки вида
1>c:\program files (x86)\vc\include\xutility(559): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1>          with
1>          [
1>              _Ty=AIDummy
1>          ]
1>          c:\program files (x86)\vc\include\memory(1447) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
1>          with
1>          [
1>              _Ty=AIDummy
1>          ]
1>          c:\program files (x86)\vc\include\xtree(1792) : see reference to function template instantiation 'bool std::_Debug_lt_pred<AIDummyLess,std::unique_ptr<_Ty>,std::unique_ptr<_Ty>>(_Pr,const _Ty1 &,const _Ty2 &,std::_Dbfile_t,std::_Dbline_t)' being compiled
1>          with
1>          [
1>              _Ty=AIDummy,
1>              _Pr=AIDummyLess,
1>              _Ty1=std::unique_ptr<AIDummy>,
1>              _Ty2=std::unique_ptr<AIDummy>
1>          ]

и т.д.

Я так понимаю, что компилятор пытается инстанцировать класс AIDummy, но он абстрактный.
добавил разметку
Re: Абстрактный класс, unique_ptr и std::set (VS 2012)
От: Peregrin  
Дата: 12.09.13 09:08
Оценка: 1 (1)
Здравствуйте, dummii_02, Вы писали:

_>Я так понимаю, что компилятор пытается инстанцировать класс AIDummy, но он абстрактный.


Компилятор пытается скопировать TDDummyUPtr при передаче его в AIDummyLess::operator().
Поменяйте сигнатуру вот так:

    bool operator() (const TDDummyUPtr& AFirst
        , const TDDummyUPtr& ASecond )
Re[2]: Абстрактный класс, unique_ptr и std::set (VS 2012)
От: dummii_02  
Дата: 12.09.13 09:17
Оценка:
Здравствуйте, Peregrin, Вы писали:

P>Здравствуйте, dummii_02, Вы писали:


_>>Я так понимаю, что компилятор пытается инстанцировать класс AIDummy, но он абстрактный.


P>Компилятор пытается скопировать TDDummyUPtr при передаче его в AIDummyLess::operator().

P>Поменяйте сигнатуру вот так:

P>
    bool operator() (const TDDummyUPtr& AFirst
P>        , const TDDummyUPtr& ASecond )


спасибо, это действительно помогло. А можно узнать, как Вы это опредилили?
Просто я плохо понимаю ошибки компиляции STL, поэтому и спрашиваю
Re[3]: Абстрактный класс, unique_ptr и std::set (VS 2012)
От: Peregrin  
Дата: 13.09.13 13:43
Оценка:
Здравствуйте, dummii_02, Вы писали:

_>спасибо, это действительно помогло. А можно узнать, как Вы это опредилили?

_>Просто я плохо понимаю ошибки компиляции STL, поэтому и спрашиваю

Ошибки в шаблонах нужно читать снизу вверх. Последнее сообщение об ошибке компиляции такое:
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\memory(1447) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
1>          with
1>          [
1>              _Ty=AIDummy
1>          ]

memory(1447) это
unique_ptr(const _Myt&);    // not defined

Если покрутить билд лог чуть вверх, то там
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xutility(561): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1>          with
1>          [
1>              _Ty=AIDummy
1>          ]

где xutility(561) это

    else if (_Pred(_Right, _Left))

Что наводит нас на мысль о том, что ошибка где-то в предикате.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.