gcc 버그인지 아니면 코드 문제인지....?
글쓴이: mtorange / 작성시간: 월, 2004/04/26 - 7:25오후
아래와 같이 y.cpp 라는 파일을 만들어 두고..
1 #include <stdio.h>
2
3 class foo
4 {
5 public:
6 foo()
7 {
8 puts("foo()");
9 }
10 template <class T> T *create()
11 {
12 return new T;
13 }
14 };
15
16 class bar
17 {
18 private:
19 foo *m_foo;
20 public:
21 bar(foo *x) : m_foo(x)
22 {
23 puts("bar()");
24 }
25 template <class T> T *create()
26 {
27 return m_foo->create<T>();
28 }
29 };
30
31
32 template <class T> T *zzz()
33 {
34 foo x;
35 return x.create<T>(); //-- compile error
36 }
37
38 template <class T> int *yyy()
39 {
40 foo x;
41 return foo.create<int>(); //-- compile error
42 }
43
44 int *xxx()
45 {
46 foo x;
47 return foo.create<int>();
48 }
49
50
51
52 int main(int argc, char* argv[])
53 {
54 foo x;
55 bar y(&x);
56 x.create<int>();
57 y.create<char *>();
58 zzz<int>();
59 yyy<int>();
60 xxx();
61 return 0;
62 }
63
g++ y.cpp 하면 아래와 같이 나옵니다.
y.cpp: In function `T* zzz()': y.cpp:35: error: parse error before `>' token y.cpp: In function `int* yyy()': y.cpp:41: error: parse error before `>' token
꼭 이소스만 그런것은 아니고 비슷한 경우의 다른 샘플에서는 bar::create<> 에 해당하는 함수가 컴파일이 안되는 경우도 있구요..
gcc 3.3.3 을 썼는데 gcc 자체의 버그가 아닌가 싶습니다. 혹시 여기에 대한 정보가 있는 분이 계신가요?
* VC++ 7.0 (.NET) 에서는 제대로 컴파일 됩니다.
Forums:


41, 47 라인은 다른 문제때문에 일단 에러일 것 같습니다. 객체없이
41, 47 라인은 다른 문제때문에 일단 에러일 것 같습니다. 객체없이 멤버함수 호출을 못할테니까요... 그걸 접어두고 실험해 보았습니다.
이리 저리 머리를 굴리다가 결국 다음과 같이 하니 컴파일 에러없이 잘 동작하였습니다.
x.foo::create<T>()
이렇게 해본 저 자신도 이런 형태의 멤버함수 호출은 처음 봅니다... 어렴풋이 그렇게 해야 하겠다는 생각은 드는데 왜 그런지 딱 뭐라 말하기가...
근데, 이렇게 해도 되는건가요? 이런게 괜히 g++에만 되고 표준이 아닌 그런것은 아닐까요? 고수분의 시원한 답변 기다립니다.
Re: gcc 버그인지 아니면 코드 문제인지....?
잘은 모르는 내용이긴 합니다만, 이런 경우 foo::create() 가 멤버 템플릿이므로 이렇게 써야 표준에 부합한다고 들었습니다. (왠지는 저도 잘 모릅니다만)
template <class T> T *zzz() { foo x; return x.template create<T>(); } template <class T> int *yyy() { foo x; return x.template create<int>(); }p.s. GCC 3.4.X 서부터 적용될 예정이었다고 들었는데 3.3.X 에서도 적용되는 모양이군요. 약간 의외네요.
[quote="bugiii"]41, 47 라인은 다른 문제때문에 일단 에
41, 47라인은 오타입니다. x.create.. 가 맞습니다.
그나저나 x.foo::create<T>() 는 좀 신기한 expression이긴하네요. ^^;
댓글 달기