1 #include <stdio.h>
  2
  3 template <int N>
  4 struct Base {
  5     int base[N];
  6     Base() {
  7         for (int i=0; i<N; ++i)
  8             base[i] = i;
  9     }
 10 }; 
 11
 12 int base[1024];
 13
 14 template <int N>
 15 struct Foo : public Base<N> {
 16     void dump () {
 17         for (int i=0; i<N; ++i)
 18             printf ("%d ", base[i]);
 19         printf ("\n");
 20     }
 21 }; 
 22
 23 int main (int argc, char **argv) {
 24     Foo<10> foo;
 25     foo.dump ();
 26 }

The test CPP program gives different with SunStudio CC and g++.

g++:          0 0 0 0 0 0 0 0 0 0
sunstudio CC: 0 1 2 3 4 5 6 7 8 9

And, if we comment out line #12, i.e., the definition of ::base[], g++ would complain:

test.cpp: In member function `void Foo<N>::dump()':
test.cpp:18: error: `base' undeclared (first use this function)

It's a bug of g++? Actually, no, it's the correct behavior. Refer to the release note of gcc 3.4.

> In a template definition, unqualified names will no longer find
> members of a dependent base (as specified by [temp.dep]/3 in
> the C++ standard).

评论:

发表一条评论:
该日志评论功能被禁用了。

This blog copyright 2009 by yongsun