【问题标题】:Template specialization of variable template and type deduction变量模板的模板特化和类型推导
【发布时间】:2020-04-23 09:52:35
【问题描述】:
template <class C>
C fnc();

template <>
int fnc(){return 0;}

template <class C>
C var;

template <>
int var = 0; // compile error

int main()
{
}

有一个fnc 函数的特化声明没有明确的类型指示(例如int fnc&lt;int&gt;()),所以模板参数的类型是从函数返回类型推导出来的,但是这对变量模板不起作用(它会导致编译器错误)。这是所有已测试的编译器(clang、gcc)中的正确行为还是错误?

【问题讨论】:

  • 下一次,请在“错误”上进行搜索,以查看之前是否未提出过该问题,然后再询问(或至少 - 将其包含在问题中)。注意:从技术上讲,这不是错误。
  • 这不是重复的,因为我对函数和变量声明之间的概念差异感兴趣
  • "这不是重复的,因为我对函数和变量声明之间的概念差异感兴趣" 1)你的问题没有提到这个。因此,对于一个问题,它仍然是重复的。 2)主要区别很明显:一个是函数,而另一个是变量。
  • @user3514538 根据链接帖子的回答,可以从函数参数类型推断,看来函数模板专业化也不应该起作用,它有没有论据。即使我不确定为什么 gcc 和 clang 接受它......

标签: c++ templates template-meta-programming template-specialization


【解决方案1】:

模板参数只能在函数模板的显式特化中被省略。由于你有一个模板变量,你必须添加&lt;int&gt; 部分:

template <>
int var<int> = 0;

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多