using ObjectID = size_t;
class Component;
template<typename TComponent>
Component* GetComponent(const ObjectID&);
template<typename TComponent>
class ComponentManager {
friend Component* GetComponent<TComponent>(const ObjectID&);
private:
int a;
};
template<typename TComponent>
Component* GetComponent(const ObjectID& id) {
ComponentManager<TComponent>* a = nullptr;
a->a = 5;
return nullptr;
}
class Component {
public:
virtual ~Component() = default;
};
class CC: public Component {
};
int main() {
GetComponent<CC>(5);
return 0;
}
이제 저기서 friend 선언 지우면 컴파일 에러남
근데 템플릿 클래스랑 함수는 굳이 dllexport할 이유가 없을 텐데 왜 한 거임?
템플릿 클래스는 뭘 말하는지 모르겠는데, 함수는 클라쪽에서 사용하려고 export 했음
아 Component base 클래스를 만들고 그걸 상속받아서 한거구나. 아니 근데 내 코드가 왜 틀린건지 이해가 안감... 프렌드로 해놨으면 멤버 접근 가능한게 정상 아님? 두 번째 글에서 실험했을때는 됐는데...
아 저 반환형의 Component도 템플릿이었어? 그러면 그냥 TComponent*로 바꿔도 됨. 핵심은 클래스 안에서 friend선언하는 함수에 따고 template선언하지 말고 ComponentManager의 template typename을 넣어주면 되는 거임
그리고... 첫 번째 글 코드 잘못올렸었음. 2번째 코드가 GetComponent였는데 그거 GetComponentManager로 바뀜. AddComponent, GetComponent, GetComponentManager는 다 잘 되는데, HasComponent만 이상;; 그리고 늦었지만 감사합니다.
HasComponent 사용할 때 반환값을 bool로 해놔서 그럼
방금 찾았음. 하 리턴타입을 잘못 맞춰놨었네...
답변해주신분들 모두 감사요. 고쳤습니다