我正在尝试从STL向量创建特定长度的de类向量。 那是我的代码
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cassert>
#include <vector>
#include<complex>
using namespace std;
template <class T, int N>
class KN : public vector<T> {
public:
KN(){T b=0;
for (int i=0; i<N; i++){(*this).push_back(b);}}
KN(vector<T> a) { for (int i=0; i<N; i++){(*this).push_back(a[i]);}}
KN & operator +(const KN & v){
vector<T> sortie;
for(int i=0; i<N; i++)
{(sortie).push_back((*this)[i]+v[i]);}
return KN(sortie); };
friend int conj(const int& x)
{
return(x);
};
friend double conj(const double& x)
{
return(x);
};
T & operator , (const KN & v){
T c();
for(int i=0; i<N; i++)
{
c=c+ (*this)[i] * conj(v[i]);
}
return c;
};
KN & operator * (const T& e){
vector<T> sortie;
for(int i=0; i<N; i++)
{
sortie.pusk_back((*this)[i]* e);
}
return KN(sortie);
};
};
我正在用这个main.cpp测试我的函数
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cassert>
#include <vector>
#include<complex>
#include "ex3.hpp"
using namespace std;
int main()
{
KN<int,10> vint;
KN<int,10> vint2;
for(int i =0; i<10; i++)
{vint[i]=1;}
for(int i =0; i<10; i++)
{vint2[i]=2;}
for(int i =0; i<10; i++)
cout<<(vint +vint2)[i]<<endl;
cout<<(vint ,vint2)[i]<<endl;
cout<<(vint*2)[i]<<endl;
但我有所有这些错误:
main3.cpp: In function `int main()':
main3.cpp:50: error: name lookup of `i' changed for new ISO `for' scoping
main3.cpp:48: error: using obsolete binding at `i'
main3.cpp:50: error: invalid types `int[int]' for array subscript
ex3.hpp: In member function `KN<T, N>& KN<T, N>::operator+(const KN<T, N>&) [with T = int, int N = 10]':
main3.cpp:49: instantiated from here
ex3.hpp:23: error: invalid initialization of non-const reference of type 'KN<int, 10>&' from a temporary of type 'KN<int, 10>'
ex3.hpp: In member function `T& KN<T, N>::operator,(const KN<T, N>&) [with T = int, int N = 10]':
main3.cpp:50: instantiated from here
ex3.hpp:39: error: pointer to a function used in arithmetic
main3.cpp:50: instantiated from here
ex3.hpp:39: error: assignment of function `T c() [with T = int, int N = 10]'
ex3.hpp:39: error: cannot convert `int (*)()' to `int ()()' in assignment
main3.cpp:50: instantiated from here
ex3.hpp:41: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int (*)()'
ex3.hpp: In member function `KN<T, N>& KN<T, N>::operator*(const T&) [with T = int, int N = 10]':
main3.cpp:51: instantiated from here
ex3.hpp:49: error: 'class std::vector<int, std::allocator<int> >' has no member named 'pusk_back'
main3.cpp:51: instantiated from here
ex3.hpp:51: error: invalid initialization of non-const reference of type 'KN<int, 10>&' from a temporary of type 'KN<int, 10>'
是的,有人可以帮帮我吗?我不知道如何以良好的方式宣布我的职能......
答案 0 :(得分:1)
for(int i =0; i<10; i++)
cout<<(vint +vint2)[i]<<endl;
cout<<(vint ,vint2)[i]<<endl;
cout<<(vint*2)[i]<<endl;
你错过了循环语句的大括号。
KN(vector<T> a)
这不是你如何声明一个vector-from-vector构造函数。你应该使用:
KN(const vector<T>& a)
请除了重载operator,
之外,请另外找到其他方法。你甚至没有做对:你需要返回一个临时的,而不是修改对象并返回对它的引用。
您的代码也会加载拼写错误。请清理一下,更好地解释你在这里要做的事情。
如果它是可行的,如果有人告诉我这个功能有什么问题,我会很高兴
KN & operator +(const KN & v) {
vector<T> sortie;
for(int i=0; i<N; i++) {
(sortie).push_back((*this)[i]+v[i]);
}
return KN(sortie);
};
很多东西。首先,你回来了错误的东西;你没有从+返回引用,你返回一个对象。 1 + 1
为您提供int
,而不是int&
。其次,当您想要返回vector<T>
时,您正在创建KN
。首先创建一个KN
!你的return语句不是类型转换,它是从向量创建一个新对象。这里有很多浪费的行动。
KN<T, N> operator +(const KN<T, N> & v) {
KN<T, N> result(*this);
for(int i=0; i<N; i++) {
result[i] += v[i];
}
return result;
};
最后,如果你想要一个固定长度的矢量,你应该使用C ++ 11中的std::array模板或Boost中的Boost::array,如果你没有C ++ 11。