2015-01-03 2 views
-2

Я попытался исследовать эту ошибку, но это действительно запутывает, как что-то не может быть преобразовано в себя. Хотя у меня есть идея, почему.Ошибка C++ C2664: невозможно преобразовать 'mw :: World' в 'mw :: World'

Ошибка возникает в этой функции:

//GameObject.h 

#include "BasicComponents.h" 

namespace mw 
{ 

class GameObject 
{ 
public: 
    void handleEvents(mw::World world, sf::RenderWindow& screen, mw::EventList& events) 
    { 
     myInput->handleEvents(*this, screen, events); 

     //Passing world here causes the error 
     myPhysics->handleEvents(*this, world, screen, events); 

     myGraphics->handleEvents(*this, screen, events); 
    } 
}; 

}//end of namespace 

Функция, которая получает ошибку заключается в следующем:

//BasicComponents.h 

namespace mw 
{ 

//Needed for parameters 
    class GameObject; 
    class World; 
/////////////////////// 

class PhysicsComponent : public mw::Component 
{ 
public: 
    virtual void handleEvents(GameObject& object, mw::World world, sf::RenderWindow& screen, mw::EventList& events) = 0; 

}; 

}//end of namespace 

Я считаю, что проблема заключается в неполном типа, используемого в BasicComponents.h. Тем не менее, это необходимо для того, чтобы я дал функции знать, что класс существует где-то, и мы будем с ним что-то делать, когда узнаем об этом. Если это проблема, как мне ее исправить? В противном случае, почему это происходит?

Edit: конструктор копирования:

//World.h 

//Copy Constructor 
World(const World& me) 
{ 
    myMap = me.myMap; 
    myObjects = me.myObjects; 
} 

.

MCVE:

// Class1.h 

#pragma once 

#include "Class2.h" 

namespace test 
{ 

    class Class1 
    { 
    public: 

     void function(test::Class3& c3) 
     { 
      myC2->function(*this, c3); 
     } 

     Class1() {} 
     ~Class1(){} 

    private: 
     Class2* myC2; 
    }; 

}//end of namespace 


// Class2.h 

#pragma once 

namespace test 
{ 

    class Class1; 
    class Class3; 

    class Class2 
    { 
    public: 

     virtual void function(Class1 c1, Class3 c3) = 0; 

     void otherFunction(){} 

     Class2(){} 
     ~Class2(){} 

    private: 

    }; 

}//end of namespace 
+0

Создает ли 'mw :: World' конструктор копирования? Это публично? – Brian

+0

У этого есть конструктор копирования, и да, он является публичным. – Uulamock

+0

@Uulamock Покажите нам экземпляр-конструктор. – 0x499602D2

ответ

2

Вы должны увидеть какие-то предупреждения/ошибки для void handleEvents(mw::World world, sf::RenderWindow& screen, mw::EventList& events) о mw::World является неполной.

Передача класса с передачей по значению должна знать объявление класса, чтобы узнать, сколько места требуется для параметра. Даже если вы можете обмануть компилятор, размер класса в этой точке неизвестен, поэтому для параметра будет зарезервировано неправильное пространство.

Передача класса с передачей по ссылке не имеет этого ограничения, пространство, необходимое для параметра, будет иметь известный размер, даже если класс не определен.

Если можно пропускать const mw::World& world вместо mw::World world, изменив его с пропуском по значению, чтобы пройти по ссылке, GameObject.h будет иметь возможность использовать опережающее объявление о mw::World.

Наконец, я бы также рекомендовал переместить inline handleEvents на BasicComponents.cpp, дождаться тестирования перед наложением кода и только встроенного кода, который вызывает проблемы с производительностью. Как сказал Кнут, «преждевременная оптимизация - это корень всего зла».

Смежные вопросы