C++ Template오류입니다.. explicit specialization in non-namespace scope 'class JsCPPUtils::SmartPointer<T>'

jic5760의 이미지

template <typename T>
class TestClass
{
    public:
    explicit TestClass()
    {
        printf("Nothing\n");
    }
 
    template <typename U>
    TestClass(U *ptr)
    {
        printf("OTHER CLASS\n");
    }
 
    template <> // 여기서 오류발생
    TestClass(T *ptr)
    {
        printf("SAME CLASS\n");
    }
};

error: explicit specialization in non-namespace scope 'class TestClass'

이렇게 하며 오류가 나온다.. 이런 글들이 있는데 봐도 어떻게 해결할 수 있는지 모르겠네요...ㅠㅠ

jic5760의 이미지

template을 빼주니 되네요... 뭐징...ㅋㅋ

template <typename T>
class TestClass
{
    public:
    explicit TestClass()
    {
        printf("Nothing\n");
    }
 
    template <typename U>
    TestClass(U *ptr)
    {
        printf("OTHER CLASS\n");
    }
 
    TestClass(T *ptr)
    {
        printf("SAME CLASS\n");
    }
};
아이온@Naver의 이미지

수정 전 본문에서는 template specialization입니다. template class의 member function은 그 template class 자체가 속한 namespace에서 specialize를 해줘야 해요. 그리고 이 경우에는 T도 specialize 해서 fully-specialize 해줘야 하구요. 왜 표준이 그렇게 되어 있는지는 모르겠는데, 아마도 template class 안에서 template member function을 specialize 하게 해주면 partially specialized되는 거고 이건 지금의 표준에서는 허용하지 않는 거라서 그런 게 아닐까 싶네요.

수정 후의 버전은 사실 template member function이 아니라 그냥 template class의 regular function이 됐어요. 그 바로 위의 typename U의TestClass와 별개의 overloaded된 constructor입니다.

jic5760의 이미지

상세한 설명 감사합니다!