#c #tr1
#c #tr1
Вопрос:
я использую интеллектуальные указатели следующим образом:
typedef std::tr1::shared_ptr<RealAlgebraicNumber> RealAlgebraicNumberPtr;
Я использую интеллектуальные указатели, потому что RealAlgebraicNumber является «абстрактным» суперклассом. Это работает нормально, и теперь я хочу, чтобы класс инкапсулировал вектор. Это выглядит так:
class RealAlgebraicPoint
{
public:
RealAlgebraicPoint (vector<RealAlgebraicNumberPtr>amp; v);
RealAlgebraicPoint (RealAlgebraicPointamp; R);
RealAlgebraicPoint conjoin (const RealAlgebraicNumberamp; N);
private:
vector<RealAlgebraicNumberPtr> mNumbers;
unsigned int mSize;
};
И реализация такая:
RealAlgebraicPoint::RealAlgebraicPoint(vector<RealAlgebraicNumberPtr>amp; v)
: mNumbers(v), mSize(mNumbers.size()) {}
RealAlgebraicPoint::RealAlgebraicPoint(RealAlgebraicPointamp; R)
: mNumbers(R.mNumbers), mSize(mNumbers.size()) {}
RealAlgebraicPoint RealAlgebraicPoint::conjoin (const RealAlgebraicNumberamp; N)
{
vector<RealAlgebraicNumberPtr> v;
// do something fancy with v!
return RealAlgebraicPoint(v); // this is line 58
}
К сожалению, я получаю уродливые ошибки, подобные этой:
RealAlgebraicPoint.cpp: In member function 'GiNaC::RealAlgebraicPoint GiNaC::RealAlgebraicPoint::conjoin(const GiNaC::RealAlgebraicNumberamp;)':
RealAlgebraicPoint.cpp:58:32: error: no matching function for call to 'GiNaC::RealAlgebraicPoint::RealAlgebraicPoint(GiNaC::RealAlgebraicPoint)'
RealAlgebraicPoint.cpp:46:1: note: candidates are: GiNaC::RealAlgebraicPoint::RealAlgebraicPoint(GiNaC::RealAlgebraicPointamp;)
RealAlgebraicPoint.cpp:42:1: note: GiNaC::RealAlgebraicPoint::RealAlgebraicPoint(std::vector<std::tr1::shared_ptr<GiNaC::RealAlgebraicNumber> >amp;)
RealAlgebraicPoint.cpp:38:1: note: GiNaC::RealAlgebraicPoint::RealAlgebraicPoint(unsigned intamp;)
Есть идеи? Я действительно удивлен, почему он пытается позвонить RealAlgebraicPoint(GiNaC::RealAlgebraicPoint)
, поскольку я только звоню RealAlgebraicPoint(std::vector<std::tr1::shared_ptr<GiNaC::RealAlgebraicNumber> >amp;)
.
Спасибо!
Joachim
Комментарии:
1. Для меня это отлично компилируется. Опубликуйте свои инструкции includes и using.
Ответ №1:
Конструктор копирования должен принимать ссылку на const .
Комментарии:
1. Это должно быть, но это не имеет значения. Не ответ.
2. @AndreasHaferburg: Это актуально. Функция пытается вернуть временную копию, что возможно только в том случае, если конструктор копирования принимает ссылку на const .
3. @AndreasHaferburg Это актуально, поскольку сообщение об ошибке компилятора жалуется на невозможность вызвать конструктор копирования. Поскольку конструктор копирования является общедоступным, единственная (или, по крайней мере, наиболее вероятная) причина, по которой он не может его вызвать, заключается в том, что конструктор копирования принимает неконстантную ссылку (и поэтому не может быть вызван с временным).