使用具有作用于函数内部的匿名类的模板

时间:2011-01-11 15:18:55

标签: c++ templates anonymous-class

假设我有以下代码段:

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

void g()
{
   struct { void operator()(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>&)'

当全局范围foo且其类型具有名称时,这是有效的。但是当类型是在g()内声明的匿名时,它不会。

GCC为何拒绝这一点?它是有效的C ++吗?

2 个答案:

答案 0 :(得分:7)

14.3.1第2段:

本地类型,没有链接的类型,未命名的类型或类型 任何这些类型的复合不得用作 模板类型参数的templateargument。

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

答案 1 :(得分:2)

如前所述,本地类(函数中定义的类)不能用作模板参数。幸运的是,C ++ 0x修复了lambda函数:http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions