Добрый день коллеги,
прошу помощи, потому как сам к сожалению не могу понять.
вопрос: КАК ПРАВИЛЬНО ОРГАНИЗОВАТЬ СТРУКТУРУ КЛАССОВ ДЛЯ ТАКОГО СЛУЧАЯ.
Имеется:
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, но он абстрактный.
добавил разметку
Здравствуйте, dummii_02, Вы писали:
_>Я так понимаю, что компилятор пытается инстанцировать класс AIDummy, но он абстрактный.
Компилятор пытается скопировать TDDummyUPtr при передаче его в AIDummyLess::operator().
Поменяйте сигнатуру вот так:
bool operator() (const TDDummyUPtr& AFirst
, const TDDummyUPtr& ASecond )
Здравствуйте, Peregrin, Вы писали:
P>Здравствуйте, dummii_02, Вы писали:
_>>Я так понимаю, что компилятор пытается инстанцировать класс AIDummy, но он абстрактный.
P>Компилятор пытается скопировать TDDummyUPtr при передаче его в AIDummyLess::operator().
P>Поменяйте сигнатуру вот так:
P> bool operator() (const TDDummyUPtr& AFirst
P> , const TDDummyUPtr& ASecond )
спасибо, это действительно помогло. А можно узнать, как Вы это опредилили?
Просто я плохо понимаю ошибки компиляции STL, поэтому и спрашиваю
Здравствуйте, 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))
Что наводит нас на мысль о том, что ошибка где-то в предикате.