4

假设我有以下代码段:

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++ 吗?

4

2 回答 2

7

14.3.1 第 2 段:

本地类型、没有链接的类型、未命名类型或由这些类型中的任何一种复合的类型不应用作模板类型参数的模板参数。

换句话说,无效。尽管 imo 会很方便,但这也许就是 VC 允许它的原因。

于 2011-01-11T15:25:42.023 回答
2

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

于 2011-01-11T15:58:13.747 回答