std :: initializer_list:错误C2064:术语未评估为带有0个参数的函数

时间:2019-02-22 19:55:46

标签: c++ c++11 templates initializer-list

我有一个名为Vector的模板类,该类具有一个正好由类型=模板参数类型组成的三成员变量。

我从这里(Brace-enclosed initializer list constructor)了解了有关初始化程序列表构造函数的信息。我想将此技术与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

我的问题是:

错误消息说明了什么?我是新手,正在学习教程和书籍。我不明白意思。抱歉,如果错误消息太明显了。

当且仅当用户向initializer_list构造函数提供了三个参数时,我们才能限制Vector类的构造/实例化吗?

1 个答案:

答案 0 :(得分:2)

QFile file(fileName); if (file.open(QIODevice::ReadOnly)) { QDomDocument domDocument; QString errorStr; int errorLine; int errorColumn; if (!domDocument.setContent(&file, false, &errorStr, &errorLine, &errorColumn)) qDebug() << errorStr << errorLine << errorColumn; } 不是静态成员函数。

std::initializer_list<int>::size()是初始化列表时,

U::size()是无效的语法。

U

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