Закрытый скобкой список инициализаторов? преобразовать в вектор

0

поэтому у меня есть часть кода, которую я пытаюсь проверить. Код проверяет, что несколько векторов (это элементы структур) эквивалентны известным векторам в определенных точках, однако я столкнулся с проблемой. Когда я пытаюсь сравнить вектор с известным вектором следующим образом,

assert((class1.getattr().getattr().getVec(key) == {4,3,2,2}))

Я получаю следующую ошибку:

assertAll.cpp:105:82: error: could not convert ‘{4,3,2,2} from ‘<brace-enclosed initializer list> to ‘std::vector<int>

остальная часть кода правильная, а lval из assert - это, безусловно, вектор, какой он должен быть. Я компилирую с флагами, -std = С++ 11 -Wall -Wextra -pedantic -O в g++. Кто-нибудь знает, как это исправить? Есть ли способ придать скобку список инициализаторов, прикрепленный к вектору, или есть лучший способ сделать это?

  • 0
    Вы можете написать небольшую функцию, которая сравнивает векторы по элементам, а затем возвращает значение bool, которое можно проверить с помощью assert или с помощью std :: equal.
  • 0
    проблема в том, что cpp не распознает информацию в скобках как векторы, и поэтому любая функция, которая использует std :: vector, не будет работать с ней.
Показать ещё 3 комментария
Теги:
list
vector

1 ответ

1
Лучший ответ

Кто-нибудь знает, как это исправить? Есть ли способ, чтобы придать скопированному списку инициализаторов список векторов

Интересно, что я получаю совершенно другую ошибку на Clang 3.5 и GCC 4.9.2, когда я пытаюсь что-то подобное, но вы можете просто использовать синтаксис списка инициализаций для создания вектора на месте (я думаю, не вполне типизируется):

assert((class1.getattr().getattr().getVec(key) == std::vector<int>{4,3,2,2}))

Я не уверен, как это сделать, когда вы можете запускать код на Coliru и т.д., Но следующий код работает для меня в GCC 4.9.2 с использованием g++ -std=c++11 -Wall -pedantic

#include <cassert>
#include <vector>

std::vector<int> foo() {
    return {1,2,3,4};
}

template<class T>
bool is_equal(const T& a, const T& b) {
    return a == b;
}

int main()
{
    assert((foo() == std::vector<int>{1,2,3,4}));

    assert(is_equal(foo(), {1,2,3,4}));

    assert([&](std::vector<int> v) -> bool {
        return foo() == v;
    }({1,2,3,4}));
}

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

  • 0
    это не решает проблему, и я тоже попробовал это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню