如何使用不同的模板作为输入来定义函数

How to define function with different templates as input

本文关键字:输入 定义 函数 何使用      更新时间:2023-10-16

我对C++(和堆栈溢出(完全陌生,所以请耐心等待。我正在尝试创建两个模板和一个从两个模板获取输入的函数。

我尝试制作一些类似于我的代码的示例代码,并重现错误。基本上我有两个模板狗和猫,并且想创建一个分别采用狗和猫实例的运算符函数,但我真的很纠结如何编写函数头。在花了很多时间阅读Stack Overflow帖子之后,我加入了关键字"模板"和"类型名称",试图使其工作,但我不断收到错误。当前错误是

忽略候选模板:无法推断模板参数"T">

template <class T> class Dog
{
private:
    int size;
public:
  Dog(int size1)
    {
        size = size1;
    }
};
template <class T> class Cat
{
private:
    int size;
public:
    Cat(int size1)
    {
        size = size1;
    }
};
template <class T> // What to write here?
typename Cat<T>::template Cat<T> operator*(typename Dog<T>::template Dog<T> m,typename Cat<T>::template Cat<T> v)
{
    Cat<int> return_cat(1);
    return return_cat;
}
int main(int argc, char* argv[]) 
{
    Cat<double>::Cat<double> new_cat(2);
    Dog<double>::Dog<double> new_dog(4);
    Cat<double>::Cat<double> result = new_dog*new_cat; // ERROR couldn't infer template argument 'T'
    return 0;
}

我的问题是:我应该如何定义operator*函数的函数头以避免任何错误?

我不确定您要对所有范围运算符做什么。你不需要它们。只需使用正确的类型即可。我添加了 const 引用,因为它在这种情况下看起来很合理。它们不是严格要求的。

template <class T>
Cat<T> operator*(const Dog<T>& m, const Cat<T>& v)
{
    Cat<T> return_cat(1);
    return return_cat;
}
int main(int argc, char* argv[])
{    
    Cat<double> new_cat(2);    
    Dog<double> new_dog(4);    
    Cat<double> result = new_dog * new_cat;    
    return 0;
}

我不确定您对operator*()的预期用途是什么,但通常它看起来像这样:

template <class T> 
Cat<T> operator*(Dog<T> m, Cat<T> v)

这允许猫和狗在模板类相同的情况下相乘。

如果它们不一样(也就是说,猫和狗的类型不同(,你会想要这样的东西:

template <class T1, class T2> 
Cat<T2> operator*(Dog<T1> m, Cat<T2> v)

这允许猫和狗具有不同的类型并相乘。

为了简化它以便于"阅读"而不是将狗与猫"混合":),您可以玩这个重载

template <class T>
class Animal
{
  private:
    T size;
  public:
  Animal(T size1) {
    size = size1;
  }
  T getSize() {
     return size;
}
Animal<T> operator*(Animal<T> animal1)
{
  T a = animal1.getSize();
  T b = this->getSize();
  Animal<T> animal = Animal<T>(a*b);
  return animal;
 }

};

int

main(int argc, char* argv[]( {

Animal<double> cat(2);
Animal<double> dog(4);
Animal<double> result( dog*cat );
return 0;

}