Let's say I have the following snippet:
template <class T> void f(T arg) { arg(); }
void g()
{
struct { void operator()(void) { } } foo;
f(foo);
}
Visual C++ accepts this. However, when I try GCC, I get:
$ g++ --version # just in case this matters
g++ (Debian 4.4.5-8) 4.4.5
...
$ g++ foo.cc
foo.cc: In function 'void g()':
foo.cc:7: error: no matching function for call to 'f(g()::<anonymous struct>&)'
When foo
is scoped globally and its type has a name, this works. But when the type is anonymous or declared inside g()
it does not.
Why does GCC reject this? Is it valid C++?
14.3.1 paragraph 2:
A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a templateargument for a template typeparameter.
In other words, not valid. Although it would be handy imo, that's maybe why VC allows it.
As already said, a local class (a class defined within a function) can not be used as a template argument. Fortunately, C++0x fixes that with lambda functions: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With