C++/CLI - снова ошибка C2664

Я занимаюсь следующей проблемой. Чтобы быть формальным, я использую VS2010 Ultimate и пытаюсь написать приложение Windows Forms, но получаю указанную ошибку:

 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

и вот Car.h, где у меня есть объявление этого класса

    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;
    };`
}

Определение:

    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;
    };

Объявление класса, в котором метод, упомянутый в ошибке:

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();
};

и определение:

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

У меня есть определения и объявления в отдельных файлах .h и .cpp. С другими методами "Додай" и "Усун" у меня точно такие же проблемы. Если бы это могло помочь, класс Car является базовым классом для классов Rented и Unavaible. Я новичок в C++/CLI, поэтому буду очень признателен, если кто-нибудь сможет мне помочь.


person user2116987    schedule 27.02.2013    source источник


Ответы (2)


Я нахожу сообщение об ошибке странным, учитывая, что это управляемый класс. Но вы можете решить эту проблему, изменив подпись метода на:

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

То же самое для других подобных методов.

Я предполагаю, что без шляпы (^) компилятор обрабатывает переменную как обычный класс C++ и поэтому требует для нее конструктора копирования, хотя управляемые классы даже не имеют конструкторов копирования (вы можете написать их, но они никогда не вызываются неявно, как для обычных классов C++).

РЕДАКТИРОВАТЬ: об ошибке в вашем комментарии: вместо создания экземпляра класса следующим образом:

Car car;

Сделай это так:

Car^ car = gcnew Car();
person user1610015    schedule 27.02.2013
comment
После добавления ^ я получаю измененную ошибку c2664 f:\baza danych\baza\baza\Form5.h(485): error C2664: 'Bazadanych::Dodaj3' : cannot convert parameter 1 from 'Unavaible' to 'Unavaible ^' 1> No user-defined-conversion operator available, or 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called - person user2116987; 28.02.2013

Он говорит, что означает: у вас нет конструктора копирования для Car. Это может выглядеть так:

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

Немного справочной информации здесь и здесь.

person egrunin    schedule 27.02.2013