C++ 使用匿名类作用域位于函数内的模板

C++ 使用匿名类作用域位于函数内的模板,c++,templates,anonymous-class,C++,Templates,Anonymous Class,假设我有以下片段: template <class T> void f(T arg) { arg(); } void g() { struct { void operator()(void) { } } foo; f(foo); } template void f(T arg){arg();} void g() { 结构{void操作符()(void){}foo; f(foo); } Visual C++接受此。但是,当我尝试GCC时,我得到: $ g++ --

假设我有以下片段:

template <class T> void f(T arg) { arg(); }

void g()
{
   struct { void operator()(void) { } } foo;

   f(foo);
}
template void f(T arg){arg();}
void g()
{
结构{void操作符()(void){}foo;
f(foo);
}

Visual C++接受此。但是,当我尝试GCC时,我得到:

$ 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>&)'
$g++--version#以防万一
g++(Debian 4.4.5-8)4.4.5
...
$g++foo.cc
foo.cc:在函数“void g()”中:
foo.cc:7:错误:对“f(g()::&)”的调用没有匹配的函数
foo
的作用域是全局的并且它的类型有一个名称时,这就起作用了。但是当类型是匿名的或在
g()
中声明时,它不会

GCC为什么拒绝这一点?它是有效C++(

143.1)第2段:

本地类型、无链接的类型、未命名类型或 由这些类型中的任何一种混合而成的混合物不得用作混合物 模板typeparameter的templateargument


换句话说,这是无效的。虽然在我看来这很方便,但这可能就是VC允许它的原因。

正如前面所说的,本地类(在函数中定义的类)不能用作模板参数。幸运的是,C++0x通过lambda函数解决了这一问题:

确实令人沮丧。这将是一个可行的替代方案,例如C++中缺少闭包。谢谢这么简单的回答。在我看来,这种用法似乎符合该语言的“精神”,但我也能理解为什么这可能是为了节省实现人员的一些麻烦。这是一个很小的问题,它必须用不属于全局或其他名称空间的结构来混乱全局或其他名称空间,而这些结构只在单个函数中使用一次。对于这些类型的函子,您可以始终使用未命名的名称空间!我认为C++0x甚至允许将本地类用作模板参数!