54

给定以下代码:

void f()
{
    class A
    {
        template <typename T>
        void g() {}
    };
}

g++ 4.4(以及 g++-4.6 -std=gnu++0x)抱怨:“本地类中成员模板的声明无效”。

显然本地类不允许有模板成员。这个限制的目的是什么?它会在 C++0x 中被删除吗?

注意:如果我让本地类本身成为一个模板,而不是给它一个模板成员:

void f()
{
    template <typename T>
    class A
    {
        void g() {}
    };
}

我得到“错误:模板声明不能出现在块范围内”。

4

1 回答 1

12

这个限制的目的是什么?只是猜测,但是:

  • 您只能在封闭函数中使用模板类/模板成员函数。因此,您已经知道函数中所有使用的类型,因此可以直接指定使用的类型(对于几种类型,当然,模板变体会节省一些输入)。
  • 尽管看起来可能并非如此,但它适用于所有编译器创建者和错误空间,因此必须值得付出努力。

有趣的事实:尝试在函数中使用本地类作为函数中声明的 (c++0x)-lambda 函数的返回类型:MSVC 2010:内部编译器错误 ^^。

于 2010-12-08T17:42:55.713 回答