【问题标题】:Kindly explain problem in following function template declaration (Underlying cause)请解释以下函数模板声明中的问题(根本原因)
【发布时间】:2020-08-18 06:52:12
【问题描述】:

在以下代码中,谁能解释为什么我会收到以下错误: “错误:struct std::enable_if<false, double>中没有名为‘type’的类型

根据我对enable_if_t的理解,如果我不使用函数p,编译时应该没有问题。它根本不应该为简单类型生成。

但是当我将条件更改为!is_class_v<T> 时,它对简单类型工作正常,但随后对类类型停止工作。

template<typename T>
class Smart_class
{
    public:        
        enable_if_t<is_class_v<T>, T> p(T t)
        {            
            
        };
};

void f()
{
    Smart_class<double> a;
}

【问题讨论】:

  • @DanielLangr 这是一个常见的错误,应该有一些流行语。诸如“声明不是替代”之类的东西
  • 感谢 Daniel Langr。我明白了原因。
  • @Swift-FridayPie 我不认为这是重复的。该问题询问为什么 SFINAE 不能按预期工作。在这里,问题出在其他地方——p 的声明被实例化了。
  • @Daniel Langr enable_if_t 的唯一要点是防止发生替换。但是在函数声明的上下文中,当类被隐式实例化并导致语法错误时,已经发生了替换(enable_if 中没有嵌套定义)。如果“p”本身是一个模板,那将不会发生。这本质上是使用 SFINAE 的失败尝试,看起来 p 仅适用于类类型

标签: c++ templates c++17


【解决方案1】:

引用temp.inst/3.1:

类模板特化的隐式实例化导致声明的隐式实例化,而不是定义的隐式实例化,未删除的类成员函数...

这是你的情况,p 成员函数的声明被实例化,它引用了不存在的返回类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2013-07-11
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多