我正在尝试从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模板。

09-26 16:59