클래스 템플릿에서 멤버함수 템플릿을 특수화하는 방법 없을까요?

dltkddyd의 이미지

클래스 템플릿에서 특수화된 멤버함수 템플릿을 정의해서 사용하려고 아래와 같이 코드를 짰는데, 컴파일시 에러가 납니다. 클래스 템플릿에서 멤버함수 템플릿의 정의까지는 제대로 됩니다만 멤버함수 템플릿의 정의하고 컴파일 하려하면 계속 오류 메시지가 뜨네요. 코드는 다음과 같습니다.

-myb.h-

template<class targ> class SomeC {
public:
	targ x;
	targ* sum;
 
	template<class ttarg> targ* add(ttarg right);
	template<> targ* SomeC<targ>::add<char>(char right);//이 부분이 문제
	SomeC() {
		sum=NULL;
	}
	void setX(targ x) {
		this->x=x;
	}
	targ getX() {
		return x;
	}
	~SomeC() {
		if(sum!=NULL) {
			delete[] (this->sum);
		}
	}
};
 
template<class targ>
template<class ttarg>
inline targ* SomeC<targ>::add(ttarg right) {
		if(sum==NULL) {
			sum=new targ[1];
		}
		sum[0]=x+right;
		return sum;
}
 
template<>
template<>
inline targ* SomeC<char>::add<char>(char right) {//그리고 이 정의부가 문제
		if(sum==NULL) {
			sum=new char[2];
		}
		sum[0]=x;
		sum[1]=right;
		return sum;
}

-test.cpp-
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#include "myb.h"
int main() {
	SomeC<int> i_obj;
	i_obj.setX(10);
	printf("%d\n",*i_obj.add<int>(20));
 
	SomeC<char> i_obj2;
	i_obj2.setX('a');
	printf("%s\n",i_obj2.add<char>('c'));//여기 호출부도 문제
 
	return 0;
}

멤버함수 템플릿을 특수화하는 방법을 구글에서 검색해도 관련된 정보가 검색되지 않네요. 책에도 설명이 안돼있고. 문제해결좀 부탁드립니다.

oosap의 이미지

제가 전에 관련된 쓰레드를 열었었습니다.

http://kldp.org/node/136279

이 쓰레드가 도움이 되실지는 모르겠습니다만 조금이라도 힌트를 드릴 수 있을까 싶어 올려봅니다.
저도 템플릿 앞에서는 자신이 없어서 직접 답변 달 실력은 없습니다.

한가지 멤버함수 특수화에서 컴파일러 별로 상이하게 동작하는 점이 있고 특히 VS 는 비표준적인 방법을 지원하고 있었다는 경험담을 알려드립니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

익명 사용자의 이미지

qq

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.