重载运算符>类模板中的好友

Overloaded operator> friend in class template

本文关键字:好友 运算符 gt 重载      更新时间:2023-10-16

我试图在模板的类中拥有一个超载的操作员>朋友函数。该超载运算符的目的是确定左数组是否大于右数组,而不论类型如何。我想要沿arrayint> arrayfloat的线条返回布尔值。但是,在定义朋友函数后,我会出现一个错误,告诉我我有一个未申报的标识符。我在Mac上使用Xcode。知道我如何在使用朋友超载函数时如何解决此问题?

array.h

#ifndef Array_h
#define Array_h
#include <iostream>
template <class T> class Array;
template <class T, class S>
bool operator> (const Array<T>& arr1, const Array<S>& arr2);
template <class T>
class Array {
private:
   int arraySize;
   T * array;
public:
   Array() : arraySize(0), array(nullptr){};
   Array(int);
  ~Array();
   int getSize(){return this->arraySize;}
   void printArray();
   //error here, "S is an undeclared identifier"
   friend bool operator> (const Array<T>& arr1, const Array<S>& arr2) {
     return (arr1.arraySize > arr2.arraySize);
   }   
};
template <class T>
Array<T>::Array(int size) {
  this->arraySize = (size > 0 ? size : 0);
  this->array = new T [this->arraySize];
  for(int i=0; i<this->arraySize; i++) {
     this->array[i] = 0;
  }
}
template <class T>
Array<T>::~Array() {
  delete [] this->array;
}
template <class T>
void Array<T>::printArray() {
   for(int i=0; i<this->arraySize; i++) {
      std::cout << this->array[i] << std::endl;
   }
}
#endif /* Array_h */

main.cpp

#include "Array.h"
int main(int argc, char ** argv) {
  Array<int> arrayInt(5);
  Array<float> arrayFloat(10);
  std::cout << "Number of elements in integer array: " << arrayInt.getSize() 
  << std::endl;
  std::cout << "Values in integer array:" << std::endl;
  arrayInt.printArray();
  std::cout << "Number of elements in float array: " << arrayFloat.getSize() 
  << std::endl;
  std::cout << "Values in float array:" << std::endl;
  arrayFloat.printArray();
  bool isGreater = arrayInt > arrayFloat;
  std::cout << isGreater;
  return 0;
}

朋友声明不匹配函数模板,它也必须是模板:

template<typename TT, typename TS> friend bool
operator >(const Array<TT>& arr1, const Array<TS>& arr2) {
  return (arr1.arraySize > arr2.arraySize);
} 

实际上,没有必要成为朋友,在外面定义它,然后致电getSize()

template<typename T, typename S> bool
operator >(const Array<T>& arr1, const Array<S>& arr2) {
  return (arr1.getSize() > arr2.getSize());
}