Я использую умные указатели следующим образом:
typedef std::tr1::shared_ptr<RealAlgebraicNumber> RealAlgebraicNumberPtr;
Я использую умные указатели, потому что RealAlgebraicNumber - это "абстрактный" суперкласс. Это работает отлично, и теперь я хочу, чтобы класс инкапсулировал вектор. Это выглядит так:
class RealAlgebraicPoint
{
public:
RealAlgebraicPoint (vector<RealAlgebraicNumberPtr>& v);
RealAlgebraicPoint (RealAlgebraicPoint& R);
RealAlgebraicPoint conjoin (const RealAlgebraicNumber& N);
private:
vector<RealAlgebraicNumberPtr> mNumbers;
unsigned int mSize;
};
И реализация выглядит так:
RealAlgebraicPoint::RealAlgebraicPoint(vector<RealAlgebraicNumberPtr>& v)
: mNumbers(v), mSize(mNumbers.size()) {}
RealAlgebraicPoint::RealAlgebraicPoint(RealAlgebraicPoint& R)
: mNumbers(R.mNumbers), mSize(mNumbers.size()) {}
RealAlgebraicPoint RealAlgebraicPoint::conjoin (const RealAlgebraicNumber& 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::RealAlgebraicNumber&)':
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::RealAlgebraicPoint&)
RealAlgebraicPoint.cpp:42:1: note: GiNaC::RealAlgebraicPoint::RealAlgebraicPoint(std::vector<std::tr1::shared_ptr<GiNaC::RealAlgebraicNumber> >&)
RealAlgebraicPoint.cpp:38:1: note: GiNaC::RealAlgebraicPoint::RealAlgebraicPoint(unsigned int&)
Есть идеи? Я действительно смущен, почему он пытается позвонить RealAlgebraicPoint(GiNaC::RealAlgebraicPoint)
, поскольку я звоню только RealAlgebraicPoint(std::vector<std::tr1::shared_ptr<GiNaC::RealAlgebraicNumber> >&)
.
Спасибо!
Joachim