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

C模板函数重载解析错误

鲍永春
2023-03-14
namespace Random
{
    std::mt19937 engine_{ std::random_device{}() };

    template<class T, class = std::enable_if_t<std::is_integral<T>::value>>
    auto get(T from, T to)
    {
        return std::uniform_int_distribution<T>{from, to}(engine_);
    }

    template<class T, class = std::enable_if_t<std::is_same<T, float>::value>>
    auto get(T from, T to)
    {
    return std::uniform_real_distribution<T>{from, to}(engine_);
    }

}
int main()
{
    std::cout.sync_with_stdio(false);
    std::cout.setf(std::ios_base::boolalpha);
    std::cout << Random::get<float>(1.0f, 2.5f);//COMPILE TIME ERROR
    std::cin.get();
}

编译器输出: 18:4:错误:重新定义'模板T随机::get(T, T)'12:4:注意:'模板T随机::get(T, T)'之前在这里声明在函数'int main()': 28:44:错误:没有匹配函数调用'get(浮动,浮动)'28:44:注意:候选是: 12:4:注意:模板T随机::get(T, T)12:4:注意:模板参数推导/替换失败:

这项工作很好:

#include <type_traits>
#include <random>
#include <iostream>

namespace Random
{
    std::mt19937 engine_{ std::random_device{}() };

    template<class T, class = std::enable_if_t<std::is_integral<T>::value>>
    auto get(T from, T to)
    {
        return std::uniform_int_distribution<T>{from, to}(engine_);
    }

    template<class T, class = std::enable_if_t<std::is_same<T, float>::value>>
    T get(T from, T to)
    {
    return std::uniform_real_distribution<T>{from, to}(engine_);
    }

}
int main()
{
    std::cout.sync_with_stdio(false);
    std::cout.setf(std::ios_base::boolalpha);
    std::cout << Random::get<float>(1.0f, 2.5f);//GOOD
    std::cin.get();
}

还有这个:

#include <type_traits>
#include <random>
#include <iostream>

namespace Random
{
    std::mt19937 engine_{ std::random_device{}() };

    template<class T, class = std::enable_if_t<std::is_integral<T>::value>>
    auto get(T from, T to)
    {
        return std::uniform_int_distribution<T>{from, to}(engine_);
    }

    template<class T>
    std::enable_if_t<std::is_same<T, float>::value, T>
    get(T from, T to)
    {
        return std::uniform_real_distribution<T>{from, to}(engine_);
    }

}
int main()
{
    std::cout.sync_with_stdio(false);
    std::cout.setf(std::ios_base::boolalpha);
    std::cout << Random::get<float>(1.0f, 2.5f);//GOOD
    std::cin.get();
}

为什么编译器无法在第一个示例中解析此分辨率?

共有1个答案

袁耀
2023-03-14

默认参数不是签名的一部分,因此需要进行比较

template <typename T, typename>
auto get(T, T) { /* implementation1 */ }

相对

template <typename T, typename>
auto get(T, T) { /* implementation2 */ }

这被视为相同的签名(即使推断的返回类型会有所不同)

在你的工作示例中,你有不同的签名(即使 auto 会被推断为 T)

template <typename T, typename>
auto get(T, T) { /* implementation1 */ }

相对

template<class T, typename>
T get(T, T) { /* implementation2 */ }

或者

template <typename T>
std::enable_if_t<std::is_same<T, float>::value, T>
get(T, T) { /* implementation2 */ }

多亏了SFINAE,这个电话并不含糊。

允许<code>自动</code>返回类型并使用SFINAE的另一种方法是

template<class T, std::enable_if_t<std::is_integral<T>::value>* = nullptr>
auto get(T from, T to)
{
    return std::uniform_int_distribution<T>{from, to}(engine_);
}

template<class T, std::enable_if_t<std::is_same<T, float>::value>* = nullptr>
auto get(T from, T to)
{
    return std::uniform_real_distribution<T>{from, to}(engine_);
}
 类似资料:
  • 从派生,并使用自定义结构对其进行专门化。也重载。然而,这才是问题的根源。如果我尝试编译它,我会得到: 显然,没有运算符“+”。但这是我的困惑…编译器被要求实现,因为这是继承的内容。但是,我从不使用或调用。那么编译器应该尝试生成这个基类函数吗?

  • 本文向大家介绍C++函数模板与类模板实例解析,包括了C++函数模板与类模板实例解析的使用技巧和注意事项,需要的朋友参考一下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解。具体内容如下: 泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思。泛

  • 模板函数与重载是密切相关的。从函数模板产生的相关函数都是同名的,因此编译器用重载的解决方法调用相应函数。 函数模板本身可以用多种方式重载。我们可以提供其他函数模板,指定不同参数的相同函数名。例如,图12.2的printArray函数模板可以用另一printArray函数模板重载,用参数lowSubscriPt和highSubscript指定要打印的数组部分(见练习12.4)。 函数模板也可以用其他

  • 主要内容:C++ 是如何做到函数重载的在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: 但在 C++中,这完全没有必要。C++ 允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是 函数

  • 具有以下3种重载 以下内容是否格式不正确? Clang选择重载#2,而gcc无法编译(演示) 移除过载#1时,双方同意选择过载#2(演示)。 删除重载#2时,gcc选择重载#1,clang编译失败(演示)

  • 下面是index.html 它们在不同的文件夹中,但pathing应该工作,除非我只是错过了一些真正愚蠢的东西。