当前位置: 首页 > 知识库问答 >
问题:

命名空间中的函数模板专门化

潘琪
2023-03-14
namespace foo
{
   template <int>
   void function();
}

现在我想将它专门化为一个特定的值:

template <>
void foo::function<0>()
{
}

这无法用g++-std=c++11(版本4.6、4.7、4.8和4.9)编译

不同命名空间中“template void foo::function()”的专门化[-fpermissive]

namespace foo
{
   template <>
   void function<0>()
   {
   }
}

共有1个答案

齐涛
2023-03-14

根据标准§14.7.3/2,重点是:

明确的专门化应该在封闭专门化模板的命名空间中声明。声明器ID不合格的显式专门化应在模板最近的封闭命名空间中声明,如果该命名空间是内联的(7.3.1),则应在其封闭命名空间集中的任何命名空间中声明。

必须将模板<>函数<0>();放在命名空间foo中。但是,该规则只适用于非限定的声明符-ID。当您提供一个限定ID(如foo::function<0>)时,我认为该子句不应该应用,这使得clang在这里是正确的。

namespace foo {
    template <> void function<0>(); // valid: unqualified explicit specialization
                                    // in the nearest enclosing namespace of the 
                                    // template
}

namespace bar {
    template <> void function<1>(); // invalid: unqualified explicit specialization
                                    // in the wrong namespace
}

struct baz {
    template <> void function<2>(); // invalid: unqualified explicit specialization
                                    // not in namespace scope
};

template <> void foo::function<3>(); // valid: qualified explicit specialization
                                     // is in a namespace, and id is qualified

template <> void bar::function<4>(); // invalid: there is no bar::function
                                     // to specialize
 类似资料:
  • 我试图编写一个可变函数模板来计算的字节大小。这将用于一个网络编程项目,我正在工作。第一步,我在没有工作的variadic模板的情况下想出了这个: 错误代码#2。如果我将variadic模板放在不同的位置: 我得到了 错误:重载的'size t ()'调用不明确

  • 在本文中,他们说(c)是(b)的显式专门化。我的疑问是,为什么我们不能说它是(a)的显式专门化?因为我们可以为任何特定类型专门化模板。所以,当专门化int*时,为什么他们说(c)显式专门化(b)。 任何评论都将有助于理解事情。

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 我有以下模板方法: 但是我得到了那些奇怪的链接错误: /usr/lib/gcc/x86_64-redhat-linux/4.4。7/../../../../包括/c/4.4。7/例外:62:void MyStruct::readField(std::basic_istream)的多重定义 如何专门化此成员函数? 编辑 这种方法在以下方面起作用: 或者使用s或在类外使用

  • 问题: 使用继承,可以执行以下操作: ...调用foo::go()将打印“this foo Living at ” 不过,使用模板: 所有这些都与您在子类无法访问父类提供的原始版本的情况下使用虚拟方法重写时遇到的问题如出一辙。

  • 在G++中如何做到这一点? 声明类模板ss。[确定] 取消静态函数模板f[ok] 如何专门化f?[错误] 这段代码对于VC++是可以的。 在线:https://godbolt.org/z/qgq6bp