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

C++17如何在类模板中实现静态函数模板的专门化

萧宣
2023-03-14

在G++中如何做到这一点?

  • 声明类模板ss。[确定]
  • 取消静态函数模板f[ok]
  • 如何专门化f?[错误]

这段代码对于VC++是可以的。

#include<iostream>
#include<utility>
#include<typeinfo>

template<typename T> 
struct ss
{
    template<typename F>
    static constexpr auto f()
    {
        printf("template !\n");
    }

    template<>
    static constexpr auto f<int>()
    {
        printf("int !\n");
    }
};


int main(int argc, const char* argv[])
{
   return ss<int>::f<char>();
}

在线:https://godbolt.org/z/qgq6bp

source>:14:14: error: explicit specialization in non-namespace scope 'struct ss<T>'
   14 |     template<>
      |              ^
<source>:15:34: error: template-id 'f<int>' in declaration of primary template
   15 |     static constexpr auto f<int>()
      |                                  ^
<source>: In function 'int main(int, const char**)':
<source>:24:27: error: void value not ignored as it ought to be
   24 |    return ss<int>::f<char>();
      |           ~~~~~~~~~~~~~~~~^~
ASM generation compiler returned: 1
<source>:14:14: error: explicit specialization in non-namespace scope 'struct ss<T>'
   14 |     template<>
      |              ^
<source>:15:34: error: template-id 'f<int>' in declaration of primary template
   15 |     static constexpr auto f<int>()
      |                                  ^
<source>: In function 'int main(int, const char**)':
<source>:24:27: error: void value not ignored as it ought to be
   24 |    return ss<int>::f<char>();
      |           ~~~~~~~~~~~~~~~~^~
Execution build compiler 

共有1个答案

谷梁宏恺
2023-03-14

这是海合会的问题。根据CWG727,在任何作用域中都应该允许显式专门化,包括在类作用域中。

可以在定义相应主模板的任何作用域中声明显式专门化(N4868.9.8.2.3[namespace.memdef],11.4[class.mem],13.7.3[temp.mem])。

要使它与GCC一起工作,必须将显式专门化放在名称空间作用域中,这意味着必须同时显式专门化包含类。也可以使用helper函数模板,例如。

template <typename F>
constexpr auto foo() 
{
    printf("template !\n");
}
template <>
constexpr auto foo<int>() 
{
    printf("int !\n");
}

template<typename T> 
struct ss
{
    template<typename F>
    static constexpr auto f()
    {
        return foo<F>();
    }

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

  • 我试图编写一个可变函数模板来计算的字节大小。这将用于一个网络编程项目,我正在工作。第一步,我在没有工作的variadic模板的情况下想出了这个: 错误代码#2。如果我将variadic模板放在不同的位置: 我得到了 错误:重载的'size t ()'调用不明确

  • 我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。

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

  • 我有一段代码,它是做模板专门化的常用模式。为了移除main函数第一行中为Processor1指定DataType1的要求,我想改为接收一个template模板参数。看起来using指令不支持分配“open”模板参数,而且我在web中找不到任何这样的示例(可能我没有使用适当的关键字进行搜索...) 所以问题很“简单”,我如何让这段代码编译呢?在FindDefaultProcessor中,使用type

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