Система компонентов объекта неопределенные символы

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

Вот мой класс entity.hpp:

#ifndef Entity_hpp
#define Entity_hpp

#include <stdio.h>
#include <iostream>
#include <vector>
#include <Component.hpp>

using namespace std;

class Entity {

private:
vector<unique_ptr<Component>> _components;
public:
void Start();
void Update();
void Draw();

template <typename T, typename... TArgs> T& AddComponent(TArgs... args);
template <typename T> T& GetComponent();
};

#endif /* Entity_hpp */

Далее идет класс Entity.cpp:

#include "Entity.hpp"
void Entity::Update() {
for (auto& c : _components) {
c->Update();
}
}

void Entity::Draw() {
for (auto& c : _components) {
c->Draw();
}
}

void Entity::Start() {
for(auto& c : _components) {
c->Start();
}
}

template <typename T, typename... TArgs>
T& Entity::AddComponent(TArgs... args) {
T* component(new T(forward<T>(args)...));

component->entity = this;

unique_ptr<T> ptr{component};
_components.emplace_back(move(ptr));

return *component;
}

template <typename T> T& Entity::GetComponent() {
T* c;

if(find(_components.begin(), _components.end(), c) != _components.end()) {
return &c;
}

return nullptr;
}

Мой класс игры, где я добавляю свои компоненты:

#include "Game.hpp"
void Game::Start() {
auto& entity(_system.AddEntity());
auto& m(entity.AddComponent<Movement>());
}

void Game::Update() {

}

И наконец мой компонент и его родитель:

#ifndef MovementComponent_hpp
#define MovementComponent_hpp

#include <stdio.h>

#include <Component.hpp>

class Movement : Component {

public:
Movement() {};

void Start() override {};
void Update() override {};
void Draw() override {};
};

#endif /* MovementComponent_hpp */

Оба не имеют реализации в файле cpp

#ifndef Component_hpp
#define Component_hpp

#include <stdio.h>

using namespace std;

class Entity;

class Component {

public:
Entity* entity{nullptr};
virtual void Start();
virtual void Update();
virtual void Draw();
virtual ~Component();
};#endif /* Component_hpp */

И это ошибка, которую я получаю:

Ld /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug/SFML.app/Contents/MacOS/SFML normal x86_64
cd /Users/joeywelvaadt/Desktop/XCode/C++/SFML
export MACOSX_DEPLOYMENT_TARGET=10.7
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -L/Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug -L/usr/local/lib -F/Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug -F/Library/Frameworks -filelist /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Intermediates/SFML.build/Debug/SFML.build/Objects-normal/x86_64/SFML.LinkFileList -Xlinker -rpath -Xlinker @loader_path/../Frameworks -mmacosx-version-min=10.7 -Xlinker -object_path_lto -Xlinker /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Intermediates/SFML.build/Debug/SFML.build/Objects-normal/x86_64/SFML_lto.o -stdlib=libc++ -fobjc-link-runtime -framework sfml-system -framework sfml-window -framework sfml-graphics -framework sfml-audio -framework sfml-network -Xlinker -dependency_info -Xlinker /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Intermediates/SFML.build/Debug/SFML.build/Objects-normal/x86_64/SFML_dependency_info.dat -o /Users/joeywelvaadt/Library/Developer/Xcode/DerivedData/SFML-eeksqjpmpgsdomeiuuzvucxhodww/Build/Products/Debug/SFML.app/Contents/MacOS/SFML

Undefined symbols for architecture x86_64:
"Movement& Entity::AddComponent<Movement>()", referenced from:
Game::Start() in Game.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

1

Решение

Объявление и определение шаблона должны оставаться в одном и том же файле (ну, более или менее, вы также можете их как-то разделить, включив файл реализации в конец заголовка, но позвольте мне упростить вопрос для ясности). Это не тот случай для вашего Entity::AddComponent функция-член и, следовательно, ошибка.
Я бы посоветовал вам немного углубиться в язык, если вы хотите использовать такие функции, как система шаблонов.
При этом перенесите определения ваших шаблонных функций-членов в .hpp и попробуй еще раз.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]