C++ 템플릿 사용 에러 in g++ version 3.2.2

김영현의 이미지

다음과 같은 코드가 있습니다.
-------------------------------------------------------------
01: template
02: inline T::_var_type resolve(const char* name)
03: {
04: CosNaming::Name object_name(1);
05: object_name.length(1);
06: object_name[0].id = CORBA::string_dup(name);
07:
08: CNamingClient &nc = CNamingClient::instance();
09: CORBA::Object_var object = nc.naming_context()->resolve(object_name);
10: ACE_CHECK;
11:
12: if(CORBA::is_nil(object.in()))
13: ACE_ERROR ((LM_ERROR,
14: " (%P|%t) Unable to resolve the "
15: "given name.\n"));
16:
17: return T::_narrow(object.in());
18: }
---------------------------------------------------------------

VC++ 에서는 잘 컴파일 되던 녀석이.. g++을 사용해서 컴파일을 하니 에러가 발생합니다.

error는 다음과 같습니다.

line - description
-----------------------------------------
02 - 'T' was not declared in this scope
03 - ISO C++ forbids declaration of 'resolve' with no type
03 - template-id 'resolve< >' in declaration of primary template
17 - 'T' undeclared (first use this function)
17 - (Each undeclared identifier is reported only once for each functino it appears in.)
18 - parse error before '::' token

추측하건데.. T::_var_type 이란 녀석을 제대로 인식하지 못하는 것 같습니다.

_var_type은 어떤 클래스에 존재하는 타입입니다.

class XXX
{
...
typedef Something _var_type; // typedef typename Something _var_type; 이런 식으로 바꾸어야 할까요?
...
};

고수님들 도와주세요.. ㅠ_ㅠ

'아 g++ 너 왜그러니;;;'

예진아씨의 이미지

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

김영현의 이미지

실제 typedef로 타입이 정해진 부분은 제가 개발하는 부분이 아니기 때문에 - TAO라는 라이브러리 입니다 - 수정 할 수 없는 상태 입니다.

typedef Something _var_type; 의 형태를 유지하면서 해당 문제를 해결할 수 있는 방법을 찾고 싶습니다. :)

Timeless way of building software.

익명사용자의 이미지

템플릿이라면 헤더에 있을텐데 수정하면 되잖아요?

김영현의 이미지

템플릿이 헤더라 선언은 헤더에 되어있겠지만, 수많은 파일을 다 고쳐야 된다는 말씀이신가요?
차라리 템플릿을 사용하지 않고 하는 방법을 모색하는게 더 나을 것 같습니다.
하지만 템플릿을 사용하는게 인터페이스 측면에서 볼때 가장 타당하여 유지하려고 하는 것입니다.

그리고, 아직도 원인이 무엇인지 명확하게 모르기 때문에 .. 질문을 올린 것입니다.

////////////////////////////////////////
2 class A{
3 typedef int _var_type;
4 };
5
6 template
7 T::_var_type test() {
8 T::_var_type a=1;
9 return a;
10 }
11
12 int main(int argc, char* argv[])
13 {
14 test();
15 return 0;
16 }
///////////////////////////////////////////

간단하게 나마 위의 코드로 테스트를 하며 생각 중입니다. 어디 없나요? C++ 스펙을 머리에 넣어두신 분?? ㅠ_ㅠ 저는 모르겠습니다.

Timeless way of building software.

예진아씨의 이미지

6 template
7 T::_var_type test() {
8 T::_var_type a=1;
9 return a;
10 }

템플릿 키워드 다음에 < ... > 가 오든지 해야지 대체 저건 무슨 코드란 말인지?

그리고 TAO 라이브러리는 리눅스 패키지가 있으니 그냥 리눅스 패키지 설치해서 쓰세요.

데비안에도 패키지 있던데요. 처음에 답변 달아드린 대로 typename 에 대해서도 찾아보세요.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

김영현의 이미지

template 키워드 다음에 오는 기호가 HTML 태그로 인식 되었나 보군요.
제가 문제에 대한 설명을 충분히 하지 않아 오해를 드렸습니다.
TAO가 문제가 있다는게 아니라 제가 사용하는 template 방식이 잘못된 것입니다.
딱히 말하면 vc++ 컴파일러에서는 컴파일이 되는데 말이죠.

왜 자꾸 typename을 살펴보라는지 모르겠군요.
TAO의 소스를 수정해서 고쳐진다고 해도 해도 TAO의 소스를 수정하는 일은 없을 것입니다.

지금은 원인이 무엇인지 왜 에러가 나는지 알기만 해도 후련할 것 같습니다.

Timeless way of building software.

예진아씨의 이미지

그 이유를 알게 될 것입니다.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

김영현의 이미지

안되나요?

"typename 키워드를 살펴보세요.." 는 대답은 충분하지 않은 듯 하군요.

문제는 우회해서 해결했으니, 그럼.

Timeless way of building software.

예진아씨의 이미지

갖고 계신 책을 직접 찾아보세요.

KLDP 에서도 예전에 비슷한 문제가 올라왔으니 검색해 보셔도 됩니다.

옆에 KLDP 내용 검색에서 typename 으로 검색 때리면
맨 위에 바로 뜨는데 이정도면 충분하고도 남는 것 같은데요, 흠냐 ...

@ 그나저나 아직 예진아씨 팬카페에 가입 안하셨으면 가입을 환영해요 ~

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

kalstein의 이미지

정확한 코드를 올려주시면 도움이 될 듯 싶어요...^^;;;

아마 '< code >' 같은거 쓰면 되었던거 같은데...;;


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

philnet의 이미지

T::_var_type 이 T 의 static 변수인지 T에서 정의된 타입인지를 알 수 없기 때문에 나는 error입니다. 따라서 T::_var_type 형의 변수를 선언하시려면 앞에 typename을 써야 합니다.

typename 키워드를 살펴 보라고 하신것도 이것 때문일 겁니다.

KDLP 내용 검색에서 typename 을 검색해 보시면 더 자세한 설명들을 보실 수 있습니다.

cppig1995의 이미지

더 구체적으로 typename T::static_var 형태죠.
명예의 전당에 있는 비트 뒤집기 글타래 어딘가에 있었던 듯... (bitset관련)



절망으로 코딩하고 희망으로 디버깅하자.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

atraea의 이미지

;;;

jaychoi의 이미지

VC6 에서 typename 을 반드시 지정해줘야 하는 위치에서 이를 지정해주지 않아도 은근 슬쩍 문제없이 컴파일이 되는 버그가 있습니다. 이 버그는 VC7.1, VC8 에서는 수정 되었습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.