std::initializer_list: error C2064: term 不计算为采用 0 个参数的函数
std::initializer_list: error C2064: term does not evaluate to a function taking 0 arguments
我有一个名为 Vector
的模板 class,它有一个类型为模板参数类型的三元变量。
我从这里了解了初始化列表构造函数:(Brace-enclosed initializer list constructor)。我想在 SFINE std::enable_if
中应用这种技术。
这意味着当且仅当用户向 Vector
class 的构造函数提供三个参数时,我才想构造一个对象。
以下是我的尝试:
#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
我的问题是:
错误消息说的是什么?我是新手,从教程和书籍中学习东西。我无法理解其中的含义。对不起,如果它的错误信息太明显了。
当且仅当用户向 initializer_list 构造函数提供三个参数时,我们可以限制 Vector
class 的构造/实例化吗?
std::initializer_list<int>::size()
不是静态成员函数。
当 U
是初始化列表时,U::size()
是无效语法。
constexpr Vector(T const& a, T const& b, T const& c)
{
m_x = a;
m_y = b;
m_z = c;
}
您的代码可以编译。您不能限制在编译时在初始化列表构造函数中获取的元素数量。
我有一个名为 Vector
的模板 class,它有一个类型为模板参数类型的三元变量。
我从这里了解了初始化列表构造函数:(Brace-enclosed initializer list constructor)。我想在 SFINE std::enable_if
中应用这种技术。
这意味着当且仅当用户向 Vector
class 的构造函数提供三个参数时,我才想构造一个对象。
以下是我的尝试:
#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
我的问题是:
错误消息说的是什么?我是新手,从教程和书籍中学习东西。我无法理解其中的含义。对不起,如果它的错误信息太明显了。
当且仅当用户向 initializer_list 构造函数提供三个参数时,我们可以限制 Vector
class 的构造/实例化吗?
std::initializer_list<int>::size()
不是静态成员函数。
U
是初始化列表时,U::size()
是无效语法。
constexpr Vector(T const& a, T const& b, T const& c)
{
m_x = a;
m_y = b;
m_z = c;
}
您的代码可以编译。您不能限制在编译时在初始化列表构造函数中获取的元素数量。