我有一个名为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
类的构造/实例化吗?
答案 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
您的代码会编译。您不能限制在编译时在初始化列表构造器中获得的元素数量。