本地班级的会员模板

HC4*_*ica 46 c++ templates local-class c++11

给出以下代码:

 void f()
 {
     class A
     {
         template <typename T>
         void g() {}
     };
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

 void f()
 {
     template <typename T>         
     class A
     {
         void g() {}
     };
 }
Run Code Online (Sandbox Code Playgroud)

我得到"错误:模板声明不能出现在块范围内".

eci*_*eci 12

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

  • 您可以仅在封闭函数中使用模板类/模板成员函数.因此,您已经知道函数中所有使用的类型,因此可以直接指定使用的类型(对于几种类型,当然,模板变体会保存一些类型).
  • 虽然它可能看起来不是这样,但它适用于所有编译器创建者和bug的空间,所以它必须值得努力.

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

  • 您可能知道使用的类型,但它仍然会阻止您在不暴露辅助结构的情况下使用SFINAE技巧. (3认同)
  • 实际上,当本地类是在boost :: variant上与boost :: apply_visitor一起使用的访问者时,你_don't_知道类型. (3认同)
  • 如果函数本身是模板,则您也不知道所涉及的类型。尽管我不知道为什么,但这种限制很可能使编译器编写者更容易。应该能够重用用于非本地模板的代码。 (2认同)