【问题标题】:std::initializer_list: error C2064: term does not evaluate to a function taking 0 argumentsstd::initializer_list: 错误 C2064: 术语不计算为采用 0 个参数的函数
【发布时间】:2019-02-22 19:55:45
【问题描述】:

我有一个名为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 类的构造/实例化?

【问题讨论】:

  • 你很少真正需要std::initializer_list。一个普通的构造函数就可以了。 std::initializer_list 用于动态初始化列表。
  • std::initializer_list 用于动态初始化列表,这可能是我无法以上述方式进行操作的原因。

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


【解决方案1】:

std::initializer_list&lt;int&gt;::size() 不是静态成员函数。

U 是初始化列表时,U::size() 是无效语法。

constexpr Vector(T const& a, T const& b, T const& c)
{
    m_x = a;
    m_y = b;
    m_z = c;
}

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

【讨论】:

  • 我无法使用std::initializer_list&lt;int&gt; 和 SIFINE technick 来达到相同的效果吗?我需要显式提供构造函数来执行此操作吗?
  • @Using "你不能在编译时限制在初始化列表构造函数中获得的元素数量。"此构造函数比您编写的构造函数短。根据您的后续问题,我怀疑这是一个 X/Y 问题,您有一个问题 Y,找到了您认为是解决方案 X,询问了 X,现在被告知您不能做 X。随意按“提问”按钮并询问Y,潜在问题(我猜你的潜在问题是数字3实际上是Vector的模板参数,但我可能错了)
  • 嗯...虽然我的问题是显示编译器错误,但当用户向构造函数 BTW 提供超过 3 个条目时。当我学习这两个新概念(SFINE 和 initializer_list 构造函数)时,我想在这里应用,在这种情况下。
猜你喜欢
  • 2011-09-27
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多