我正在尝试从STL向量创建特定长度的向量de class。
那是我的代码
#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>'
有人可以帮我吗?我也不是如何以一种很好的方式声明我的函数...
最佳答案
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)
这不是您声明从向量复制构造器的方式。您应该使用:
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模板,如果没有C ++ 11,则应使用Boost中的Boost::array模板。