std :: initializer_list: ошибка C2064: термин не оценивает функцию, принимающую 0 аргументов - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть шаблонный класс с именем Vector, в котором есть ровно трехэлементная переменная типа = тип аргумента шаблона.

Я узнал о конструкторе списка инициализатора здесь: ( Brace-вложенный конструктор списка инициализаторов ).Я хотел применить эту технику с 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?

1 Ответ

0 голосов
/ 22 февраля 2019

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

ваш код компилируется.Вы не можете ограничить количество элементов, которые вы получаете в конструкторе списка инициализатора во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...