为标题道歉,我正在努力想出一个。
我在这里Here问了一个问题,我正试图用它来推进。我有一个结构:
namespace Complex {
typedef struct complex_t {
double re;
double im;
} complex;
}
我希望将array
或vector
推回到复杂的1D向量,如下所示:
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));
}
有没有人对我出错的地方有任何想法?我真的希望有人可以帮助我。
更新
template<typename Iterator>
vector<Complex::complex> convertToComplex(Iterator begin, Iterator end)
{
vector<Complex::complex> vals12(10);
size_t index = 0;
for(auto i=begin; (i != end); i++)
{
complex c;
c.re = *i;
c.im = *i;
vals12[index].re = c.re;
vals12[index].im = c.im;
index++;
}
return vals12;
}
错误:
error: assigning to 'double *' from incompatible type 'double'; remove *
c.re = *i;
答案 0 :(得分:2)
当您在i
初始化程序中将auto
声明为for
时,begin
的类型为double
,在这种情况下是std::vector
的指针。然后,您尝试将该指针传递给[i]
的索引运算符(尽管通过size_t index = 0;
for(auto i=begin; (i != end); i++)
{
vals12[index++].re = *i;
}
间接传递)。
您需要使用其他变量作为索引。
{{1}}
答案 1 :(得分:1)
请注意,i
是Iterator
。但是,operator[]
要求int
的索引为vector
。您至少有两个解决方案:
为矢量创建索引计数器。
创建一个空向量并使用push_back()
。
答案 2 :(得分: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;
}