Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以下程序正在抛出与错误相关的内存访问_C++_Templates_Generics - Fatal编程技术网

C++ 以下程序正在抛出与错误相关的内存访问

C++ 以下程序正在抛出与错误相关的内存访问,c++,templates,generics,C++,Templates,Generics,/这个程序使用的是模板类。我不知道为什么,但是这个程序在运行时抛出了一个与内存访问冲突相关的错误。在下面的评论中,我将解释导致此错误的行/ #包括 使用名称空间std; 常数int size=3; 模板 类向量 { T*v; 公众: 向量() { v=新T[尺寸]; 对于(int i=0;i v[i]=0; } 向量(T*a) { 对于(int i=0;i v[i]=a[i]; } T运算符*(向量和y) { T和=0; 对于(int i=0;i 总和+=此->v[i]*y.v[i]; 回报金额

/这个程序使用的是模板类。我不知道为什么,但是这个程序在运行时抛出了一个与内存访问冲突相关的错误。在下面的评论中,我将解释导致此错误的行/

#包括
使用名称空间std;
常数int size=3;
模板
类向量
{
T*v;
公众:
向量()
{
v=新T[尺寸];
对于(int i=0;i
v[i]=0;
}
向量(T*a)
{
对于(int i=0;i
v[i]=a[i];
}
T运算符*(向量和y)
{
T和=0;
对于(int i=0;i
总和+=此->v[i]*y.v[i];
回报金额;
}
作废显示(作废)
{
对于(int i=0;i
{
cout2个问题:

  • 您没有初始化向量的内存
  • 您正在错误地调用构造函数
  • 修正#1

    向量(T*a)
    {
    v=新T[尺寸];
    对于(int i=0;i
    v[i]=a[i];
    }
    
    修复#2

    intx[3]={1,2,3};
    int y[3]={4,5,6};
    向量v1(x);
    向量v2(y);
    
    我猜没有为
    向量定义
    运算符=(int[])

    所以换句话说,当涉及到类型
    int[]=vector
    时,编译器不知道您所说的
    v1=x
    是什么意思

    您没有在那里调用重载构造函数。因此您需要调用它
    vector v1(y);
    或实现
    vector::operator=(const T[]v)


    我希望我的类型是正确的

    问题似乎出在这个构造函数中

        vector(T* a)
        {
            for(int i=0;i<size;i++)>
                v[i]=a[i];
        }
    
    vector(T* a)
    {
        v = new T[size];//this line is new
        for(int i=0;i<size;i++)
            v[i]=a[i];
    }
    
    向量(T*a)
    {
    对于(int i=0;i
    v[i]=a[i];
    }
    

    您没有为v指向的数组分配内存。

    构造函数
    向量(T*a)
    将被调用,并且成员
    v
    未初始化任何内容。这会导致未定义的行为。因此,要解决此问题,您需要在该构造函数中分配内存

        vector(T* a)
        {
            for(int i=0;i<size;i++)>
                v[i]=a[i];
        }
    
    vector(T* a)
    {
        v = new T[size];//this line is new
        for(int i=0;i<size;i++)
            v[i]=a[i];
    }
    
    向量(T*a)
    {
    v=新的T[size];//这行是新的
    
    对于(int i=0;i调用相关行时,程序正在使用默认赋值运算符,该运算符正在执行导致您违反的操作。您需要自己实现此操作,例如,这对我有效:

    T& operator=(T const * a)
    {
        for(int i=0;i<size;i++)
            v[i]=a[i];
        return *this;
    }
    
    T&运算符=(T常量*a)
    {
    
    对于(inti=0;iHe没有使用std::vector,它是他自己的vector类。
    T& operator=(T const * a)
    {
        for(int i=0;i<size;i++)
            v[i]=a[i];
        return *this;
    }