2014-12-06 74 views
0

所以我有一段代碼,我試圖測試。代碼正在檢查幾個向量(這些是結構的元素)在某些點與已知向量相等,但是我遇到了一個問題。當我嘗試將向量與已知向量如下,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

回答

1

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