Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > function template and operator () overload

Reply
Thread Tools

function template and operator () overload

 
 
Fei Liu
Guest
Posts: n/a
 
      02-24-2006
Hi, I have a interesting problem here,

class absOP{
template<class T> T operator(T val) { return val < 0 ? -val : val; }
};

Now the problem is I can't seem to use this overloaded operator,

absOP op(..);

int i = -42;
float f = -2.3;

int ai = op(i); //error
ai = op<int>(i); //error
ai = op(i)<int>; //error
ai = <int>op(i); //error

Alas, I tried a couple sane ways to use function template of overloaded
operator () but none seemed to work...Any idea or help is appreciated.

 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      02-24-2006
Fei Liu wrote:
> Hi, I have a interesting problem here,
>
> class absOP{
> template<class T> T operator(T val) { return val < 0 ? -val : val; }


Did you mean to write

template<class T> T operator()(T val) { return val < 0 ? -val : val; }

? Notice the "empty set of parens" after the word 'operator'. It is also
declared private at this point.

> };
>
> Now the problem is I can't seem to use this overloaded operator,
>
> absOP op(..);
>
> int i = -42;
> float f = -2.3;
>
> int ai = op(i); //error
> ai = op<int>(i); //error
> ai = op(i)<int>; //error
> ai = <int>op(i); //error
>
> Alas, I tried a couple sane ways to use function template of overloaded
> operator () but none seemed to work...Any idea or help is appreciated.


This is covered by FAQ 5.8.

#include <iostream>
using namespace std;

struct abs_op {
template<class T> T operator()(T t) { return t > 0 ? t : -t; }
};

int main()
{
int i = -42, ii = 42;
double d = 3.14159, dd = -3.14159;

abs_op a;

cout << a(i) << ' ' << a(ii) << ' ' << a(d) << ' ' << a(dd) << endl;
}


V
--
Please remove capital As from my address when replying by mail
 
Reply With Quote
 
 
 
 
Fei Liu
Guest
Posts: n/a
 
      02-24-2006
Thanks, Victor. I am sorry I didn't put enough thought in this example.
It's a little bit more complicated than the example I gave,
class somedata{
void * data;
template<class T> T operator()(size_t index) { return
*(reinterpret_cast<T*>data + index); }
};

somedata x(....); // data is initialized but actual type of data is
unknown. data is an array
float ele = x(3); // retrieve the 4th element of data array inside x,
error
float ele = <float>x(3); //error
float ele = x<float>(3); //error
float ele = x(3)<float>; //error

I hope this made it clearer.

Victor Bazarov wrote:
> Fei Liu wrote:
> > Hi, I have a interesting problem here,
> >
> > class absOP{
> > template<class T> T operator(T val) { return val < 0 ? -val : val; }

>
> Did you mean to write
>
> template<class T> T operator()(T val) { return val < 0 ? -val : val; }
>
> ? Notice the "empty set of parens" after the word 'operator'. It is also
> declared private at this point.
>
> > };
> >
> > Now the problem is I can't seem to use this overloaded operator,
> >
> > absOP op(..);
> >
> > int i = -42;
> > float f = -2.3;
> >
> > int ai = op(i); //error
> > ai = op<int>(i); //error
> > ai = op(i)<int>; //error
> > ai = <int>op(i); //error
> >
> > Alas, I tried a couple sane ways to use function template of overloaded
> > operator () but none seemed to work...Any idea or help is appreciated.

>
> This is covered by FAQ 5.8.
>
> #include <iostream>
> using namespace std;
>
> struct abs_op {
> template<class T> T operator()(T t) { return t > 0 ? t : -t; }
> };
>
> int main()
> {
> int i = -42, ii = 42;
> double d = 3.14159, dd = -3.14159;
>
> abs_op a;
>
> cout << a(i) << ' ' << a(ii) << ' ' << a(d) << ' ' << a(dd) << endl;
> }
>
>
> V
> --
> Please remove capital As from my address when replying by mail


 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      02-24-2006
Fei Liu wrote:
> [...]


First of all, please don't top-post. I've rearranged it.

> Victor Bazarov wrote:
>
>>Fei Liu wrote:
>>
>>>Hi, I have a interesting problem here,
>>>
>>>class absOP{
>>> template<class T> T operator(T val) { return val < 0 ? -val : val; }

>>
>>Did you mean to write
>>
>> template<class T> T operator()(T val) { return val < 0 ? -val : val; }
>>
>>? Notice the "empty set of parens" after the word 'operator'. It is also
>>declared private at this point.
>>
>>
>>>};
>>>
>>>Now the problem is I can't seem to use this overloaded operator,
>>>
>>>absOP op(..);
>>>
>>>int i = -42;
>>>float f = -2.3;
>>>
>>>int ai = op(i); //error
>>>ai = op<int>(i); //error
>>>ai = op(i)<int>; //error
>>>ai = <int>op(i); //error
>>>
>>>Alas, I tried a couple sane ways to use function template of overloaded
>>>operator () but none seemed to work...Any idea or help is appreciated.

>>
>>This is covered by FAQ 5.8.
>>
>>#include <iostream>
>>using namespace std;
>>
>>struct abs_op {
>> template<class T> T operator()(T t) { return t > 0 ? t : -t; }
>>};
>>
>>int main()
>>{
>> int i = -42, ii = 42;
>> double d = 3.14159, dd = -3.14159;
>>
>> abs_op a;
>>
>> cout << a(i) << ' ' << a(ii) << ' ' << a(d) << ' ' << a(dd) << endl;
>>}


> Thanks, Victor. I am sorry I didn't put enough thought in this example.
> It's a little bit more complicated than the example I gave,


It's not just "more complicated". The template doesn't have the argument
of type 'T', and that makes it _impossible_ to tell which 'T' is going to
be used. The compiler cannot deduce it from 'size_t', and the fact that
you're using the _operator_ syntax makes it impossible to provide any
information for the deduction.

> class somedata{
> void * data;
> template<class T> T operator()(size_t index) { return
> *(reinterpret_cast<T*>data + index); }
> };
>
> somedata x(....); // data is initialized but actual type of data is
> unknown. data is an array
> float ele = x(3); // retrieve the 4th element of data array inside x,
> error
> float ele = <float>x(3); //error
> float ele = x<float>(3); //error
> float ele = x(3)<float>; //error
>
> I hope this made it clearer.


Yes. You're SOL. Don't use operator syntax. Convert to a regular
function, like so

class somedata {
...
template<class T> T doit()(size_t index) ...
};

float ele = x.doit<float>(3);

V
--
Please remove capital As from my address when replying by mail
 
Reply With Quote
 
Fei Liu
Guest
Posts: n/a
 
      02-24-2006
Unfortunately, I cannot convert it to a function. So it seems it's not
possible to make it work when function template and operator () are
used together the way I intended. Thanks again.

 
Reply With Quote
 
Maxim Yegorushkin
Guest
Posts: n/a
 
      02-25-2006

Fei Liu wrote:
> Unfortunately, I cannot convert it to a function. So it seems it's not
> possible to make it work when function template and operator () are
> used together the way I intended. Thanks again.


It's possible.

template<class T> struct type {};

struct S
{
template<class T>
T operator()(type<T>, size_t);
};

int main(int ac, char** av)
{
S s;
s(type<int>(), 1);
}

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Template/Operator Overload/Linker Error woes amhoov@gmail.com C++ 1 04-25-2007 10:30 PM
Can I overload operator<< using a template? fungus C++ 11 01-06-2007 12:34 PM
How to overload operator* for this template? Atlas C++ 13 10-20-2005 02:14 AM
function overload (not operator overload) Ying-Chieh Liao Perl Misc 3 10-11-2004 11:24 AM
How use the overload of>> (or<<) of a class in the overload of << and >> of another class? Piotre Ugrumov C++ 3 01-25-2004 08:08 PM



Advertisments