C++ template 에러 질문드립니다.

phyljh의 이미지

C++ template프로그래밍 공부하다가 이유를 모르겠어서 고수분들께 질문드립니다.
아래는 CRTP라는 것을 공부해보려고 테스트로 짜본것인데 아래처럼 클래스의 멤버변수로 T a; 이렇게 선언하면
컴파일에러가 나는데 static 함수안에 T c; 이렇게 선언하면 컴파일이 됩니다.
무슨 차이점이 있는것인가요?
도움 부탁드립니다.

#include <iostream>
using namespace std;
template<typename T> class Base
{
    // T b;   <---- error: ‘Base<T>::b’ has incomplete type
    public:
    static T* getInstance()
    {
        T c;   <---- 이거는 괜찮고
        T* a = new T();
        return a;
    }
};
class AAA : public Base<AAA>
{
};
 
int main()
{
    AAA * pa = AAA::getInstance();
    return 0;
}
익명 사용자의 이미지

표준문서 들고 와서 이론을 따져봐도 재밌기야 하겠습니다만...

Base가 T a를 멤버 변수로 가지고, class AAA가 Base를 상속받게 만들면
(1) AAA instance는 Base를 상속받아 포함하고
(2) Base instance는 AAA를 멤버 변수로 포함하는 꼴이 되는데

대충 봐도 안 될 거 같지 않습니까??

라스코니의 이미지

class Base를 제대로 사용하는 것이 아니라 static 함수로 C 방식처럼 호출하는 것이 보여요.
class Base에 인터넷을 참조해서 생성자를 정의해서 해 보세요.
T b; 당연히 되야 해요.