我想比较两个对象,并使用模板在它们之间变大。将对象作为参数传递并不像下面的代码那样工作。请参阅下面给出的示例代码。这就是我想要做的事情。
#include <iostream>
using namespace std;
template <class T>
class max
{
T a;
public:
max(T a)
{
this.a = a;
}
T Large(T n2)
{
return (a > n2.a) ? a : n2.a;
}
};
int main()
{
max <int> obj1(10);
max <int> obj2(20);
cout<<obj1.Large(obj2)<<" is larger"<<endl;
return 0;
}
我做了类似的事情,但通过比较2个对象。
// class templates
#include <iostream>
using namespace std;
template <class T>
class mypair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T getmax ();
};
template <class T>
T mypair<T>::getmax ()
{
T retval;
retval = a>b? a : b;
return retval;
}
int main () {
mypair <int> myobject (100, 75);
cout << myobject.getmax();
return 0;
}
答案 0 :(得分:0)
我认为您正在尝试这样做:
template <typename T>
T max(const T &a, const T &b)
{ return (b < a) ? a : b; }
你是怎么做到的。你班上奇怪的杂乱无益是没有任何意义的。因此,如果我得到你想做错的事,请更好地解释自己。
模板不必是您认识的课程。你可以有模板化的功能。
如果您绝对必须使用课程,请执行以下操作:
template <typename T>
class max
{
T operator ()(const T &a, const T &b) { return (b < a) ? a : b; }
};
int main()
{
max<int> foo;
cout << foo(10, 20) << " is larger\n"; // Don't use endl most of the time.
return 0;
}
假设您有两个不是对象的对象,您会怎么做?好吧,你这样做:
#include <iostream>
#include <algorithm>
struct A {
int v1;
int v2;
};
bool operator <(A &a, A &b)
{
return (a.v1 < b.v1) || ((a.v1 == b.v1) && (a.v2 < b.v2));
}
::std::ostream &operator <<(::std::ostream &os, const A &a)
{
os << "{" << a.v1 << ", " << a.v2 << "}";
}
int main()
{
A first{10, 20};
B second{20, 10};
::std::cout << ::std::max(first, second) << " is the larger.\n";
}
如果您不想定义operator <
,请执行以下操作:
bool my_less_than(const A &a, const A &b)
{
return (a.v1 < b.v1) || ((a.v1 == b.v1) && (a.v2 < b.v2));
}
int main()
{
A first{10, 20};
B second{20, 10};
::std::cout << ::std::max(first, second, my_less_than) << " is the larger.\n";
}
答案 1 :(得分:0)
此代码似乎工作正常,如果有帮助,请告诉我
#include <iostream>
using namespace std;
template <class T>
class Maxi {
T a;
public:
Maxi(T val)
{
this->a = val;
}
T Large(maxi n2)
{
return (a > n2.a) ? a : n2.a;
}
};
int main() {
Maxi <int> obj_1(10);
Maxi <int> obj_2(20);
cout<<obj_1.Large(obj_2)<<" is larger"<<endl;
return 0;
}
答案 2 :(得分:0)
算法下已经提供了最大和最小模板功能。
只需拨打std::max(10, 20)
即可获得两者之间的较大值。
您甚至可以提供自己的比较器进行自定义比较。
旁注:似乎通过包含iostream,你可以在没有算法的情况下使用max和min。
答案 3 :(得分:0)
我看到的问题:
的使用
using namespace std;
可能会让你感到困惑,因为std::max
会被间接地混入。 g++
对我有用。不要使用它。
以下行中的语法错误:
this.a = a;
那需要
this->a = a;
Large
的参数必须是max
类型,而不是T
。
为了更好的衡量,我还会将其设为const
成员函数。
T Large(max n2) const
{
return (a > n2.a) ? a : n2.a;
}
使用std::cout
和std::endl
,因为using namespace std;
存在问题。
以下是您的代码的更新版本,其中包含以上修复程序:
#include <iostream>
template <class T>
class max
{
private:
T a;
public:
max(T a)
{
this->a = a;
}
T Large(max n2) const
{
return (a > n2.a) ? a : n2.a;
}
};
int main()
{
max <int> obj1(10);
max <int> obj2(20);
std::cout << obj1.Large(obj2) << " is larger"<<std::endl;
return 0;
}
它适用于我并产生以下输出:
20 is larger