c++ 템플릿 관련 질문입니다.
글쓴이: fopenfclose / 작성시간: 화, 2015/12/08 - 3:23오후
클래스 템플릿 전문화 하려고
#include "Common.h"
#include "CCard.h"
template<>
class CDeck
{
public:
explicit CDeck();
~CDeck();
CCard * createNode();
void push(CCard *);
CCard pop();
private:
CCard * m_top;
};이렇게 짰는데
"class CDeck is not an entitity that can be explicitly specialized"
라는 에러 메세지를 냅니다. 이 메세지를 구글에서 검색해봐도 자바 클래스 얘기들만 나오고
원인을 찾을 수 없는데 혹시 왜 이렇게 되는건지 알려주실 수 있나요??
Forums:


의견
답변은 아니고 의견입니다.
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=239369379&qb=dGVtcGxhdGU8Pg==&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0&pid=SEiJ1doRR1VssuT6VBZsssssstN-364216&sid=1PsZyOj2fLiWzmQhNQNzKA%3D%3D
이것을 참조한다면, 이런 식으로 작성하면 어떤가요?
#include "Common.h" #include "CCard.h" template<> class CDeck<char> { public: explicit CDeck(); ~CDeck(); CCard * createNode(); void push(CCard *); CCard pop(); private: CCard * m_top; };CDeck은 암묵적으로 특수화될 수 없는 개체라는 것인데,
그러면 특수화하려는 형식을 지정해주면 되지 않나 하는 생각입니다.
------------------------
이건 잘 되는군요.
#include <iostream> template <class T> class Data { T _value; public: Data(const T& value) : _value(value) {} T value() const { return _value; } void setValue(const T& value) { _value = value; } }; template<> class Data<char> { char _value; public: Data(const char& value) : _value(value) {} char value() const { return _value; } void setValue(const char& value) { _value = value; } void show() const { std::cout << _value << std::endl; } }; int main(void) { Data<int> data_int(50); std::cout << data_int.value() << std::endl; Data<char> data_char('A'); std::cout << data_char.value() << std::endl; data_char.show(); return 0; }저는 이렇게 생각했습니다.
#include "Common.h" #include
#include "Common.h" #include "CCard.h" template<> class CDeck<char> { public: explicit CDeck(); ~CDeck(); CCard * createNode(); void push(CCard *); CCard pop(); private: CCard * m_top; };답변 감사합니다.
작성해주신 소스에서
class CDeck 에서
class CDeck<다른 클래스> 의 형태 처럼 작성해도 되는건가요??
답변
네. 그럴 의도로 작성한 코드였습니다.
저는 이렇게 생각했습니다.
헤더 파일 입니다. #pragma
헤더 파일 입니다. #pragma once #include "Common.h" #include "CCard.h" template <typename T> class CDeck { public: explicit CDeck(); ~CDeck(); T * createNode(); void push(T *); T pop(); private: T * m_top; }; template <> class CDeck<CCard> { public: explicit CDeck(); ~CDeck(); CCard * createNode(); void push(CCard *); CCard pop(); private: CCard * m_top; };#include "CDeck.h" template <typename T> CDeck<T>::CDeck() { } template <typename T> CDeck<T>::~CDeck() { } // template <typename T> CCard * CDeck<T>::createNode() { CCard * cardNode = new CCard(); return cardNode; } // template <typename T> void CDeck<T>::push(CCard * card) { CCard * cardNode = createNode(); if (cardNode == NULL) { cout << "create card node fail" << endl; return; } if (m_top == NULL) cardNode->nodeNext = NULL; else cardNode->nodeNext = m_top; m_top = cardNode; cout << "card push success" << endl; }궁금한 점은
.cpp 파일에서 헤더 파일에서 선언된 일반 클래스 템플릿을 정의해야 하나요?
아니면 전문화된 템플릿을 정의해야 하나요??
아니면 둘 다 정의가 되어 있어야 하나요??
댓글 달기