为什么不能在 C++ 中为动态数组重载插入运算符?
Why is it not possible to overload insertion operators in c++ for a dynamic array?
我是 C++ 新手。出于好奇,我想看看当我尝试为动态数组的 class 重载插入“>>”运算符时会发生什么。我认为我正在尝试做的事情是不可能的。但是谁能解释这个错误是什么意思? (代码下方错误)
#include<iostream>
using namespace std;
template<class Type>
class Array{
private:
int length;
Type* ptrarr;
public:
int size() const;
Type* get_array() const;
friend istream& operator >> (istream& s, Array<Type>& arr);
};
template<class Type>
int Array<Type>::size() const{
return length;
}
template<class Type>
Type* Array<Type>::get_array() const{
return ptrarr;
}
template<class Type>
istream& operator >> (istream& s, Array<Type>& arr){
cout << "Enter length of array"; cin >> arr.length;
arr.ptrarr = new Type[arr.length];
for(int i = 0; i < arr.length; i++){
cout << "Array[" << i << "] = ";
cin >> *(arr.ptrarr + i);
}
return s;
}
int main(){
Array<int> intarray;
cin >> intarray;
int* ptr = intarray.get_array();
for(int i =0; i < intarray.size(); i++)
cout << *(ptr+i);
return 0;
}
我收到错误
in function `main':
dyn_array.cpp:(.text+0x1e): undefined reference to `operator>>(std::istream&, Array<int>&)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
您的 friend
声明引用了一个非模板 operator>>
,它与模板一的定义不匹配。
引用模板 operator>>
进行 friend
声明,例如
// forward declaration for the class template
template<class Type>
class Array;
// declaration
template<class Type>
istream& operator >> (istream& s, Array<Type>& arr);
然后
template<class Type>
class Array{
// friend declaration
friend istream& operator >> <Type> (istream& s, Array<Type>& arr);
// ^^^^^^
// or just <> (make use of template argument deduction)
...
};
// definition
template<class Type>
istream& operator >> (istream& s, Array<Type>& arr) {
...
}
或如,保持operator >>
为非模板,并在class定义中定义。
template<class Type>
class Array{
...
friend istream& operator >> (istream& s, Array<Type>& arr) {
...
}
};
我是 C++ 新手。出于好奇,我想看看当我尝试为动态数组的 class 重载插入“>>”运算符时会发生什么。我认为我正在尝试做的事情是不可能的。但是谁能解释这个错误是什么意思? (代码下方错误)
#include<iostream>
using namespace std;
template<class Type>
class Array{
private:
int length;
Type* ptrarr;
public:
int size() const;
Type* get_array() const;
friend istream& operator >> (istream& s, Array<Type>& arr);
};
template<class Type>
int Array<Type>::size() const{
return length;
}
template<class Type>
Type* Array<Type>::get_array() const{
return ptrarr;
}
template<class Type>
istream& operator >> (istream& s, Array<Type>& arr){
cout << "Enter length of array"; cin >> arr.length;
arr.ptrarr = new Type[arr.length];
for(int i = 0; i < arr.length; i++){
cout << "Array[" << i << "] = ";
cin >> *(arr.ptrarr + i);
}
return s;
}
int main(){
Array<int> intarray;
cin >> intarray;
int* ptr = intarray.get_array();
for(int i =0; i < intarray.size(); i++)
cout << *(ptr+i);
return 0;
}
我收到错误
in function `main':
dyn_array.cpp:(.text+0x1e): undefined reference to `operator>>(std::istream&, Array<int>&)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
您的 friend
声明引用了一个非模板 operator>>
,它与模板一的定义不匹配。
引用模板 operator>>
进行 friend
声明,例如
// forward declaration for the class template
template<class Type>
class Array;
// declaration
template<class Type>
istream& operator >> (istream& s, Array<Type>& arr);
然后
template<class Type>
class Array{
// friend declaration
friend istream& operator >> <Type> (istream& s, Array<Type>& arr);
// ^^^^^^
// or just <> (make use of template argument deduction)
...
};
// definition
template<class Type>
istream& operator >> (istream& s, Array<Type>& arr) {
...
}
或如operator >>
为非模板,并在class定义中定义。
template<class Type>
class Array{
...
friend istream& operator >> (istream& s, Array<Type>& arr) {
...
}
};