std :: initializer_list:错误c2064:项未评估为0参数的函数

std::initializer_list: error C2064: term does not evaluate to a function taking 0 arguments

本文关键字:评估 函数 参数 initializer list 错误 c2064 std      更新时间:2023-10-16

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;
}

您的代码编译。您不能在编译时限制在初始化器列表构造函数中获得的元素数量。