||=== 构建文件: "无目标" 在 "无项目" 中 (编译器: 未知的) ===| D:\Code\C++Files\Mo\test.cpp||In instantiation of 'std::ostream& operator<<(std::ostream&, LinkedList<T>) [with T = int; std::ostream = std::basic_ostream<char>]':| D:\Code\C++Files\Mo\test.cpp|82|required from here| D:\Code\C++Files\Mo\test.cpp|66|error: passing 'const LinkedList<int>' as 'this' argument discards qualifiers [-fpermissive]| D:\Code\C++Files\Mo\test.cpp|46|note: in call to 'int LinkedList<T>::size() [with T = int]'| D:\Code\C++Files\Mo\test.cpp|68|error: passing 'const LinkedList<int>' as 'this' argument discards qualifiers [-fpermissive]| D:\Code\C++Files\Mo\test.cpp|32|note: in call to 'T& LinkedList<T>::operator[](int) [with T = int]'| ||=== 构建 失败: 2 error(s), 2 warning(s) (0 分, 1 秒) ===|
时间: 2023-07-19 19:43:07 浏览: 161
这段代码中出现了两个错误,都是因为operator<<函数中的参数类型为const LinkedList<T>,而在这个函数中调用了LinkedList类的非const成员函数,导致编译器报错。
第一个错误是在调用size函数的时候出现的,因为size函数不是const成员函数,而operator<<函数的参数类型为const LinkedList<T>,无法调用非const成员函数。解决办法是将size函数定义为const成员函数。
第二个错误是在调用operator[]函数的时候出现的,同样是因为operator[]函数不是const成员函数。解决办法是将operator[]函数定义为const成员函数,以便在const对象上也可以调用。
修改后的代码如下:
```
#include <iostream>
using namespace std;
template <typename T>
class LinkedList {
template <typename U>
friend ostream& operator << (ostream& out, const LinkedList<U>& ll);
struct Node {
T data;
Node* next;
Node(T data = T()) : data(data), next(nullptr) {}
} *head = new Node();
public:
LinkedList() {}
void append(T data) {
Node* ptr = head;
while (ptr -> next != nullptr) ptr = ptr -> next;
ptr -> next = new Node(data);
return;
}
T& operator [] (int index) const {
Node* ptr = head -> next;
int length = 0;
while (length != index) {
ptr = ptr -> next;
length ++;
}
return ptr -> data;
}
int size() const {
Node* ptr = head;
int length = 0;
while (ptr -> next != nullptr) {
ptr = ptr -> next;
length ++;
}
return length;
}
};
template <class T>
ostream& operator << (ostream& out, const LinkedList<T>& ll) {
out << "[ ";
for (int _ = 0; _ < ll.size(); _ ++) {
out << ll[_] << ' ';
}
out << ']';
return out;
}
int main() {
LinkedList<int> l = LinkedList<int>();
l.append(10);
l.append(100);
l.append(1000);
cout << l << endl;
return 0;
}
```
经过修改后,程序可以正确地输出链表中的元素。
阅读全文