编译包含此类的代码:
<link href="css/app.css" rel="stylesheet">
产生错误:
[错误]没有匹配的调用功能 'std :: vector :: push_back(const Figures&amp;)const'
这是我应该在main()
中做的class Dessin
{
private:
vector<Figures*>T;
public:
void ajouteFigure(const Figures& f) const
{
for(auto element: T)
{
T.push_back(f);
}
}
};
为什么这不起作用?
答案 0 :(得分:5)
假设Cercle
是一个类名,你试图推送一个指向预期值的值。
To&#34; fix&#34;您应该更改ajouteFigure
原型以接受Figures
指针和非常量this
的错误:
void ajouteFigure(Figures* f)
然后你应该调用它传递指向Figures
对象的指针,即使用new
表达式创建:
s.ajouteFigure(new Cercle(1.1));
话虽如此,这段代码似乎毫无意义。您添加指针的次数与向量中的元素一样多(在您提供的示例中始终为0)。
使用原始指针也是未经修改的,您应该使用像std::unique_ptr
这样的智能指针,尽管这会破坏当前的代码。
考虑这个,不太不恰当的例子:
class Dessin
{
private:
vector<unique_ptr<Figures>> T;
public:
void ajouteFigure(unique_ptr<Figures> f)
{
T.push_back(move(f)); // just once
}
};
并在通话现场:
Dessin s;
s.ajouteFigure(make_unique<Cercle>(1.1)); // C++≥14
或者,如果你不能使用C ++ 14:
Dessin s;
s.ajouteFigure(unique_ptr<Figures>(new Cercle{1.1}));
答案 1 :(得分:1)
为了补充一点,我认为最好将它作为模板函数,并在函数内创建正确的对象,并将参数传递给作为函数参数传递的构造函数。
这样,您每次调用此函数时都不必创建std::unique_ptr
或使用new
。
这是一个基本的实现:
class Dessin{
public:
template<typename T, typename ... Args>
void ajouteFigure(Args &&... args){
figures.emplace_back(new T(std::forward<Args>(args)...));
}
private:
std::vector<std::unique_ptr<Figures>> figures;
};
然后使用该类不易出错:
int main(){
Dessin d;
d.ajouteFigure<Cercle>(1.1);
}