gpt4 book ai didi

c++ - 关于 operator[] 的编译错误

转载 作者:行者123 更新时间:2023-11-27 22:46:33 26 4
gpt4 key购买 nike

我创建了一个模板类 vect,它允许我创建类型为 T 的元素数组,从 1 到 n(而不是 0 到 n-1)访问它们并排列它们(我必须以这种方式排列它们而不是排列他们以经典方式)。

这是头文件:

#ifndef VECT_HPP

#define VECT_HPP

#include <vector>

template <class T>
class vect
{
public:
vect(int=0);
~vect();
void show(void) const;
void permute(int,int);
T& operator[](int);
const T& operator[](int) const;
void init_perm(void);
private:
int n;
double* p;
std::vector<int> s;
};

#endif /* GUARD_VECT_HPP */
#include "vect.cpp"

这是源文件:

#ifndef VECT_CPP
#define VECT_CPP

#include "vect.hpp"
#include <iostream>

using namespace std;

template <class T>
vect<T>::vect(int a): n(a)
{
p=new double[n];
s.resize(n);
init_perm();
}

template <class T>
vect<T>::~vect()
{
delete [] p;
}

template <class T>
void vect<T>::show(void) const
{
for (int i = 0; i < n; i++)
cout << p[i] << endl;
}

template <class T>
void vect<T>::permute(int a,int b)
{
static int c;
a--;
b--;
c=s[a];
s[a]=s[b];
s[b]=c;
}
template <class T>
T& vect<T>::operator[](int i)
{
return p[s[i-1]-1];
}

template <class T>
const T& vect<T>::operator[](int i) const
{
return p[s[i-1]-1];
}

template <class T>
void vect<T>::init_perm(void)
{
for (int i = 0; i < n; i++)
s[i]=i+1;
}

#endif

这是我用来测试类(class)的 main.cpp 文件:

#include "vect.hpp"
#include <iostream>

using namespace std;

int main(void)
{
vect<int> v(5);
v.show();
for (int i = 1; i <=5; i++)
v[i]=10*i;
v.show();
cout << "Permuted 3 and 5" << endl;
v.permute(3,5);
v.show();
v.init_perm();
cout << "Initialized permutations" << endl;
v.show();
return 0;
}

我收到以下错误:

In file included from vect.hpp:25:0,
from main.cpp:1:
vect.cpp: In instantiation of ‘T& vect<T>::operator[](int) [with T = int]’:
main.cpp:11:6: required from here
vect.cpp:43:19: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
return p[s[i-1]-1];

我在 Internet 上搜索了这个错误以及它是如何由 operator[] 的错误实现引起的,但是在更正之后我仍然有同样的错误,即使我返回 p [i-1] 而不是 p[s[i-1]]

你能帮帮我吗?

最佳答案

问题源于 p 与模板 T 的类型不匹配。

您有一个 double 数组,由 p 指向。而模板 T 是一个 int。通常这不是什么大问题,因为 double 可以隐式转换为 int。但这不是正常情况,因为您想要返回 intreference

编译器会为您转换为 int,但此转换后的值是一个右值 并且是一个临时值,引用不能绑定(bind)到右值。

解决方案是避免类型不匹配,而是让 p 指向一个 T 数组。或者更好的是,让它成为一个 std::vector

关于c++ - 关于 operator[] 的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42153055/

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