C 模板功能过载分辨率错误
C++ template function overload resolution bug
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 Random :: get(t,t)'12:4:注意:'模板t random :: get(t,t)先前在此处声明 在函数" int main()"中:28:44:错误:无匹配功能呼叫'get(float,float)'28:44:注意:候选人是:12:4:注意:模板t Random :: 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();
}
为什么编译器无法在第一个示例中解析此分辨率?
默认参数不是签名的一部分,因此您比较
template <typename T, typename>
auto get(T, T) { /* implementation1 */ }
vs
template <typename T, typename>
auto get(T, T) { /* implementation2 */ }
被视为相同的签名(即使推导的返回类型也有所不同)
在您的工作示例中,您有不同的签名(即使将自动推荐为t)
template <typename T, typename>
auto get(T, T) { /* implementation1 */ }
vs
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,呼叫不是模棱两可的。
允许auto
返回类型并使用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_);
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- QScreen geometry()api为分辨率2736 x 1824和2560 x 1600提供了错误的值
- C 模板功能过载分辨率错误
- 这是 gcc 过载分辨率中的错误吗?
- Linux中的QPrinter分辨率错误
- 可变模板分辨率在VS2013 -错误C3520