gpt4 book ai didi

c++ - C++对析构函数的 undefined reference 和对返回的局部变量的引用

转载 作者:行者123 更新时间:2023-12-02 11:11:36 25 4
gpt4 key购买 nike

我正在尝试创建一个从另一个类模板继承的类模板,第一个是只包含纯虚拟方法的类,第二个是将要操作的类。我正在尝试构建的 vector 类的大小由第二个模板参数确定。基类将用于创建另一个 vector 类,该 vector 类的大小对于该类的每个对象都将有所不同。

摆弄2-3天后,我不知道如何解决在尝试编译项目时发生的一系列错误。

这是标题(Vect.hpp)

#ifndef NEWFILE1_HPP
#define NEWFILE1_HPP

#include <cstddef>
#include <iostream>
#include <exception>
#include <stdexcept>

template <class elem>
class Vect
{
public:
virtual elem& operator[] (std::ptrdiff_t nIndex) =0;
virtual const elem& operator[] (std::ptrdiff_t nIndex) const =0;
virtual Vect& operator+() =0;
virtual Vect& operator-() =0;
virtual Vect& operator+(const elem&) =0;
virtual Vect& operator-(const elem&) =0;
//virtual Vect& operator*(const elem&) =0;

virtual ~Vect();

};


template <class elem, std::size_t taille=10>

class Vect_fixe: public Vect<elem>
{
template <typename T, std::size_t D>
friend std::ostream& operator<< (std::ostream&, const Vect_fixe<T, D>&);

public:
Vect_fixe():vecteur(new elem[taille]) {};
virtual elem& operator[] (std::ptrdiff_t nIndex);
virtual const elem& operator[] (std::ptrdiff_t nIndex) const;
virtual Vect_fixe& operator+();
virtual Vect_fixe& operator-();
virtual Vect_fixe& operator+(const elem&);
virtual Vect_fixe& operator-(const elem&);


private:
elem vecteur[taille];
~Vect_fixe(){delete[] vecteur;}
};

这是定义功能并进行测试的程序(main.cpp)
#include <cstdlib>
#include "Vect.hpp"
#include <exception>
#include <stdexcept>

template <class elem, std::size_t taille>
elem& Vect_fixe<elem, taille>::operator[] (std::ptrdiff_t nIndex)
{
if (nIndex >= taille)
throw std::out_of_range("Index out of range.");
return vecteur[nIndex];

};

template <class elem, std::size_t taille>
const elem& Vect_fixe<elem, taille>::operator[] (std::ptrdiff_t nIndex) const
{
if (nIndex >= taille)
throw std::out_of_range("Index out of range.");
return vecteur[nIndex];

};

template <class elem, std::size_t taille>
Vect_fixe<elem, taille>& Vect_fixe<elem, taille>::operator +()
{
return *this;
}

template <class elem, std::size_t taille>
Vect_fixe<elem, taille>& Vect_fixe<elem, taille>::operator -()
{
Vect_fixe<elem, taille> temp_v;
for (int i=0; i<taille; i++)
temp_v[i] = -temp_v[i];
return temp_v;
}

template <class elem, std::size_t taille>
Vect_fixe<elem,taille>& Vect_fixe<elem, taille>::operator+(const elem&)
{
Vect_fixe<elem, taille> temp_v;
elem obj;
for (int i=0; i<taille; i++)
temp_v[i] += obj;
return temp_v;
}

template <class elem, std::size_t taille>
Vect_fixe<elem,taille>& Vect_fixe<elem, taille>::operator-(const elem&)
{
Vect_fixe<elem, taille> temp_v;
elem obj;
for (int i=0; i<taille; i++)
temp_v[i] -= obj;
return temp_v;
}


int main() {

int x;
x = 5;
Vect_fixe<int, 10> vect;
//std::cout<< vect << std::endl;



return 0;
}

我得到的错误如下:
g++ -std=c++14    -o dist/Debug/Cygwin_4.x-Windows/cppapplication_2 build/Debug/Cygwin_4.x-Windows/Vect.o build/Debug/Cygwin_4.x-Windows/main.o 
build/Debug/Cygwin_4.x-Windows/main.o: In function `Vect_fixe<int, 10ul>::~Vect_fixe()':
/cygdrive/e/University/BA2/Langages de Programmation/Projet C++/CppApplication_2/Vect.hpp:48: undefined reference to `Vect<int>::~Vect()'
/cygdrive/e/University/BA2/Langages de Programmation/Projet C++/CppApplication_2/Vect.hpp:48:(.text$_ZN9Vect_fixeIiLm10EED1Ev[_ZN9Vect_fixeIiLm10EED1Ev]+0x3f): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Vect<int>::~Vect()'
collect2: error: ld returned 1 exit status

导致这种状态的原因是我试图修复先前的错误,该错误是对局部变量的引用返回。我在某些函数中添加了const关键字,但这似乎无法解决问题,因此我还原了,这就是发生的情况。该错误对我来说真的很不清楚,可能是因为我习惯于使用Python进行编程,几乎每个错误都得到了解释。

最佳答案

  • 您的某些函数(例如operator -())返回对堆栈分配变量的引用。一旦功能退出,这些将超出范围。

  • 那是不确定的行为。

    补救措施是返回值副本。从函数中删除引用返回类型。
  • 您需要提供~Vect()~Vect_fixe()的实现。如果不需要它们,则不要在类中声明它们。
  • 关于c++ - C++对析构函数的 undefined reference 和对返回的局部变量的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33942915/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com