Brace封闭的初始化程序列表?转换为矢量

问题描述:

所以我有一段代码,我试图测试。代码正在检查几个向量(这些是结构的元素)在某些点与已知向量相等,但是我遇到了一个问题。当我尝试将向量与已知向量如下,Brace封闭的初始化程序列表?转换为矢量

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中是绝对是一个应有的载体。我正在用g ++编译-std = C++ 11 -Wall -Wextra -pedantic -O。有人知道如何解决这个问题吗?有没有一种方法可以将括号初始化列表括起来作为向量,还是有更好的方法来做到这一点?

+0

你可以编写一个小函数来比较向量元素,然后返回一个可以使用assert检查的bool值,或者使用std :: equal。 – learningToCode 2014-12-06 02:03:11

+0

问题是cpp不能识别括号内的信息作为向量,因此使用std :: vector的任何函数都无法工作。 – Eric 2014-12-06 02:06:57

+0

我们的第一个想法是将它传递给一个比较函数,但是因为我们不能将第二部分作为矢量进行投射,显然这也不起作用。 – Eric 2014-12-06 02:08:02

Does anybody know how to fix this? Is there a way to typecast the bracket enclosed initializer list to a vector

有趣的是,我得到一个完全不同的错误上锵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})); 
} 

当然,没有人在他们的正确思想中会使用这样的lambda,但正如您从示例中可以看出的,您基本上只需告诉编译器双方是相同的类型就可以转换初始化器列表到一个向量。

+0

,这不解决问题,我也试过。 – Eric 2014-12-06 02:13:23