【问题标题】:Using templates with anonymous classes scoped inside a function在函数内使用具有匿名类的模板
【发布时间】:2011-01-11 15:18:54
【问题描述】:

假设我有以下 sn-p:

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

【问题讨论】:

    标签: c++ templates anonymous-class


    【解决方案1】:

    14.3.1 第 2 段:

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

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

    【讨论】:

    • 确实令人沮丧。例如,对于 C++ 中缺少闭包,这将是一个可行的替代方案。
    • 感谢您这么直截了当的回答。对我来说,这种用法似乎符合该语言的“精神”,但我也可以理解为什么这可能会被限制在为实现者省去一些麻烦。
    • 完全正确。令人遗憾的是,必须将全局或其他名称空间与实际上不属于那里但只在单个函数中使用一次的结构混在一起..
    • 你总是可以为那些函子使用未命名的命名空间!
    【解决方案2】:

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

    【讨论】:

    • 我认为 C++0x 甚至允许将本地类用作模板参数!
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多