Re: typedef in template class
On Mar 11, 7:26 pm, Jonathan Thornburg <clcppm-pos...@this.is.invalid>
wrote:
[N.b.: This is *not* a homework exercise.]
I'm encountered some strange-to-me behavior when trying to use typedefs
(defined in a template class) in other templates, and I'm wondering
if someone can point me to what's going on, i.e., why what I expected
to be legal code is being rejected by my compiler (g++ 4.2.4).
To be specific, consider the following C++ code:
#include <complex> // 1
// 2
template <typename fp> // 3
class A // 4
{ // 5
public: // 6
typedef std::complex<fp> field; // 7
}; // 8
// 9
template <typename fp> // 10
void foo() // 11
{ // 12
typedef A<float>::field float_field; // 13
typedef A< fp>::field fp_field; // 14
A<fp>::field is a dependent name. Since you haven't told the
compiler otherwise, it assumes that field is *not* the name of a
type nor the name of a template. (It's impossible to parse C++
without knowing which names are types, and which are templates.)
Of course, using anything but a type here is an error;
regretfully, according to the standard, the compiler is not
required to diagnose this error here. And if A<fp>::field does
happen to be a type in the actual instantiation, the behavior is
undefined. Good modern compilers will complain immediately
here, but it's a quality of implementation issue. (And there
are a number of reasons why older compilers may let the issue
ride.)
Try telling the compiler that A<fp>::field is a type:
typedef typename A<fp:field fp_field;
and see if that doesn't improve things.
The same holds for all uses of A<fp>::field in the rest of your
code. Just add the necessary typename.
--
James Kanze
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]