Article View: gnu.g++.help
Article #939Re: Help needed on function templates
From: Dietmar Kuehl
Date: Thu, 04 Apr 1996 15:40
Date: Thu, 04 Apr 1996 15:40
78 lines
2997 bytes
2997 bytes
Hi,
seedy@ultranet.com wrote:
: When attempted to compile the following code I got the following error :
: I use g++ (2.7.1) on HP-UX 10.x.
: news.cc: In function `int equal(const class abc &, const class abc &)':
: news.cc:23: no match for `operator ==(class abc, class abc)'
There is indeed no 'operator==()' defined in your class which takes a
const object as first argument and there is no built-in conversion from
a const object to a non-const one (sure: this would mean to create a
non-const unnamed temporary but all unnamed temporaries are const).
Thus, all you need to do, is to declare your 'operator==()' as it
should be declared: as 'const'.
: #include <iostream.h>
: class abc {
: public :
: abc( int x )
: {
: a = x;
: b = 0;
: }
: int a;
: int b;
: inline int operator ==(abc x)
inline int operator == (abc x) const
Actually, I think this operator should be declared as
inline bool operator == (abc const &x) const
The implementation can stay as is...
: {
: return ((a==x.a) && (b==x.b));
: }
: };
: template < class Element>
: inline int equal (Element const& e1, Element const& e2)
: {
: return e1 == e2;
: }
: main()
: {
: abc a1(5), a2(5);
: cout << "Return value is = " << equal(a1, a2) << endl;
: }
: Even though the 'operator ==' is overloaded in class abc, compiler is
: reporting match not found. By making the overloaded function 'operator =='
: as friend to 'class abc' I could resolve the problem, because in this case,
: this overloaded function becomes outsider function.
You probably declared your "outsider" 'operator==' like this:
int operator== (abc a, abc b) { /*...*/ }
In this case, a (non-const) copy is made of the 'const' arguments
passed to it in the 'equal()' function. This is the reason why it
worked then.
: As far as I know, template instantiation for function 'equal will be done
: for 'class abc'(because the passed parameters are of type class abc),
: and so the corresponding member function 'operator ==' can be used for
: template variables e1 and e2.
You are right: for non-const variables it should work...
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl/
I am a realistic optimist - that's why I appear to be slightly pessimistic
Technical Details
Message-ID:
<4k0qi8$r4f@news.BelWue.DE>Path:
arc1-ca.pugleaf.net!news.belwue.de!horn!kuehlReferences:
<NEWTNews.828674472.23501.seedy@trigent.trigent.com>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.belwue.de!horn!kuehl From: kuehl@horn.informatik.uni-konstanz.de (Dietmar Kuehl) Newsgroups: gnu.g++.help,comp.sys.lang.c++,comp.lang.c++ Subject: Re: Help needed on function templates Followup-To: gnu.g++.help,comp.sys.lang.c++,comp.lang.c++ Date: 4 Apr 1996 15:40:56 GMT Organization: Fakultät für Mathematik und Informatik Message-ID: <4k0qi8$r4f@news.BelWue.DE> References: <NEWTNews.828674472.23501.seedy@trigent.trigent.com> Reply-To: dietmar.kuehl@uni-konstanz.de NNTP-Posting-Host: horn.informatik.uni-konstanz.de X-Newsreader: TIN [version 1.2 PL2]