Question

I am dealing with following problem. To be formal I am using VS2010 Ultimate and I try to write an windows forms application, but I get specified error:

 1>f:\baza danych\baza\baza\Form5.h(475): error C2664: 'Bazadanych::Dodaj1' : cannot           convert parameter 1 from 'Car' to 'Car'
1>          Cannot copy construct class 'Car' due to ambiguous copy constructors or no available copy constructor

and here are Car.h where I have declaration of this class

    public ref class Car
{
public:
    String^ category;
    String^ model;
    String^ rocznik;
    String^ cena;

    Car(){};
    Car(String^ ,String^ ,String^ );
    void edytuj(String^ ,String^ ,String^ );
    String^ getmodel(){return this->model;};
    String^ getrocznik(){return this->rocznik;};
    String^ getcena(){return this->cena;};
    virtual String^ getcat()
    {
        this->category="To rent";
        return this->category;
    };`
}

Definition:

    Car::Car(String^ model1,String^ rocznik1,String^ cena1)
    {
       this->model=model1;
       this->rocznik=rocznik1;
       this->cena=cena1;
    };

    void Car::edytuj(String^ model1,String^ rocznik1,String^ cena1)
    {
       this->model=model1;
       this->rocznik=rocznik1;
       this->cena=cena1;
    };

Declaration of class where method mentioned in error is:

public ref class Bazadanych
{
public:
cliext::list<Car^> Bazatorent;
cliext::list<Rented^> Bazarented;
cliext::list<Unavaible^> Bazaunavaible;
cliext::list<Car^>::iterator it1;
cliext::list<Rented^>::iterator it2;
cliext::list<Unavaible^>::iterator it3;

Bazadanych()
{
    it1=Bazatorent.begin();
    it2=Bazarented.begin();
    it3=Bazaunavaible.begin();
};
bool Empty();
void Dodaj1(Car);
void Dodaj2(Rented);
void Dodaj3(Unavaible);
void Usun1(Car);
void Usun2(Rented);
void Usun3(Unavaible);
void Czysc();
};

and definition:

void Bazadanych::Dodaj1(Car Element)
{
this->Bazatorent.push_back(Element);
};

I have definitions and declarations in separatly .h and .cpp files. For other methods "Dodaj" and "Usun" I have exactly the same problems. If it could help the class Car is base class for class Rented and Unavaible. I am pretty new in C++/CLI, so I will be very grateful if someone could help me.

Was it helpful?

Solution

I find the error message strange given that it's a managed class. But you can solve it by changing the method's signature to:

void Bazadanych::Dodaj1(Car^ Element) // notice the "^"

Same for the other similar methods.

I'm guessing that without the hat (^), the compiler treats the variable as a regular C++ class, and therefore requires a copy constructor for it, even though managed classes don't even have copy constructors (you can write them but they're never called implicitly like for regular C++ classes).

EDIT: About the error in your comment: Instead of instantiating the class like this:

Car car;

Do it like this:

Car^ car = gcnew Car();

OTHER TIPS

It says what it means: you have no copy constructor for Car. It might look like this:

Car::Car(const Car& c) { 
    /* your code here*/ 
};

Some background here and here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top