2013-07-05 31 views
0

爲標題道歉,我一直在努力想出一個。將值推入結構中

我在這裏問了一個關於Here的問題,我正在嘗試使用它。我有一個結構:

namespace Complex { 

typedef struct complex_t { 
    double re; 
    double im; 
    } complex; 
} 

我想逼退任何一個arrayvector複雜的一維向量,如下:

template<typename Iterator> 
vector<Complex::complex> convertToComplex(Iterator begin, Iterator end) 
{ 
    vector<Complex::complex> vals12(10); 


    for(auto i=begin; (i != end); i++) 
    { 
     vals12[i].re = *i; 
    } 

    return vals12; 
    } 

並得到以下錯誤:

no viable overloaded operator[] for type 'vector<Complex::complex>' vals12[i].re = *i;

現在請注意,如果我做到以下幾點:

vals12[0].re = 10;

會工作,但是,當使用數組時它會拋出這個錯誤,我不明白爲什麼會這樣。我唯一的想法是,這可能是由於我通過了一個array而不是一個矢量。這裏是完整的代碼:

#include <iostream> 
#include <vector> 
#include "complex.h" 

using namespace std; 
//using namespace Complex; 

template<typename Iterator> 
vector<Complex::complex> convertToComplex(Iterator begin, Iterator end) 
{ 
    vector<Complex::complex> vals12(10); 


for(auto i=begin; (i != end); i++) 
{ 
    vals12[i].re = *i; 
} 

return vals12; 
} 

class Value 
{ 
    public: 
    template <typename Fred> 
    Value(Fred begin, Fred end) 
    { 
      vector<Complex::complex> vec = convertToComplex(begin, end); 
    } 
    }; 

    int main() 
    { 
    double vals[] = {10, 23, 23, 34, 354}; 
    Value v(std::begin(vals), std::end(vals)); 
    } 

有沒有人有任何想法,我要去哪裏錯了?我真的希望有人能幫助我。

更新:

錯誤:

error: assigning to 'double *' from incompatible type 'double'; remove * c.re = *i;

+1

C++不是C,你可以說'結構複雜{...};'而失去的typedef –

+0

這行代碼給出了錯誤的更新嗎? –

回答

2

當在for初始化花費上的begin類型在本例中是一個指向double聲明iauto。然後您試圖將該指針傳遞給std::vector的索引運算符(儘管通過[i]間接)。

您將需要使用一個額外的變量作爲索引。

size_t index = 0; 
for(auto i=begin; (i != end); i++) 
{ 
    vals12[index++].re = *i; 
} 
+0

感謝您的回覆。使用這種方法,我得到以下錯誤:'從不兼容類型'double'分配給'double *';刪除* vals12 [index ++]。re = * i;' – Phorce

+0

使用您的問題中提供的代碼和我的答案中的例子,它編譯並運行良好。 –

+0

這是一個[現場示例](http://ideone.com/vkKTL2) –

1

注意iIterator。但是,operator[]預計intvector的索引。您至少有兩種解決方案:

  1. 爲矢量中的索引創建一個計數器。

  2. 創建一個空向量並使用push_back()

+0

嘿,我實施了你提出的建議,但得到了錯誤(請看我原來的帖子)。感謝您的幫助 – Phorce

+0

'vector vals12(10);'創建一個包含10個默認構造元素的向量。與這個答案所說的相反,元素*是可以使用的,'vals12 [0] .re = * i;'是很好定義的。 – Mankarse

+0

@Mankarse grr這是我得到的來回切換語言(我的原始答案是Java ArrayList的行爲。)...感謝您的更正。 –

1

其他的答案解釋了爲什麼你的代碼不能編譯。實際上,你想變換算法:

namespace Complex { 
    struct complex_t { 
    double re; 
    double im; 
    }; 
} 
template<typename Iterator> 
vector<Complex::complex_t> convertToComplex(Iterator begin, Iterator end) 
{ 
    vector<Complex::complex_t> vals12; 

    std::transform(begin, end, std::back_inserter(vals12), 
        [](const double& d){ return Complex::complex_t{d,0}; }); 

    return vals12; 
}