std :: initializer_list:错误c2064:项未评估为0参数的函数
std::initializer_list: error C2064: term does not evaluate to a function taking 0 arguments
i有一个模板类,称为 Vector
,该类具有一个恰好的三序变量type = template参数类型。
我已经从此处了解了初始化器列表构造函数:(带括号封闭的初始化器列表构造函数)。我想将此技术与Sfine std::enable_if
应用。
这意味着我只想在用户提供Vector
类构造函数的三个参数时才构造对象。
以下是我的尝试:
#include <initializer_list>
#include <type_traits>
template<typename T> class Vector
{
private:
T m_x, m_y, m_z;
public:
template<typename U = std::initializer_list<T>,
typename std::enable_if_t<U::size() == 3>
>
constexpr Vector(const U &list)
{
auto iter = list.begin();
m_x = *iter;
m_y = *(++iter);
m_z = *(++iter);
}
};
int main()
{
Vector<int> vec = { 1, 2, 3 };
return 0;
}
但是我遇到以下错误:
error C2064 : term does not evaluate to a function taking 0 arguments
note: see reference to class template instantiation 'Vector<int>' being compiled
error C2440 : 'initializing' : cannot convert from 'initializer list' to 'Vector<int>'
note: No constructor could take the source type, or constructor overload resolution was ambiguous
这是在线结果:https://godbolt.org/z/njf6ym
我的问题是:
错误消息在说什么?我是新手,从教程和书籍中学习了一些东西。我无法理解含义。抱歉,如果它太明显了错误消息。
我们可以限制Vector
类的构建/实例化,并且仅当用户向initializer_list构造函数提供三个参数?
std::initializer_list<int>::size()
不是静态成员函数。
U::size()
是无效的语法,当U
是初始化列表时。
constexpr Vector(T const& a, T const& b, T const& c)
{
m_x = a;
m_y = b;
m_z = c;
}
您的代码编译。您不能在编译时限制在初始化器列表构造函数中获得的元素数量。
相关文章:
- 在编译时评估函数开销的通用方法
- 函数参数计算顺序与 Lambda 捕获评估顺序
- 为什么不能订购函数参数评估
- 表达式未评估为常数两个级别的constexpr函数(编译器错误?)
- C2064:术语未评估为1个参数qtConcurrent :: map的函数
- 在评估不同参数的constexpr函数时,运行时差异
- 尝试创建一个评估字符的bool函数,如果字母数字为字母,则返回true
- 委托构造函数的评估
- std :: initializer_list:错误c2064:项未评估为0参数的函数
- 单步执行函数,但不进入VS2017的参数评估
- 用于评估导致Segfault的Postfix的函数
- 编译时间评估函数以计算常数
- 我如何评估宏函数的算术表达以传递到C预处理器中的另一个宏函数
- 如何在未评估的上下文中将成员函数的结果类型应用于类成员
- 评估采用函数参数的元功能,干燥,而无需使用宏
- 推迟对函数通话论证的评估
- 死亡测试时函数调用的评估错误
- 延迟评估模板类型函数
- Callgrind:如何使用Callgrind工具来评估函数速度
- 为什么我的数学表达式评估函数不能在Windows上工作