448,496 Members | 1,266 Online Need help? Post your question and get tips & solutions from a community of 448,496 IT Pros & Developers. It's quick & easy.

# function template and operator () overload

 P: n/a Hi, I have a interesting problem here, class absOP{ template 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(i); //error ai = op(i); //error ai = 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. Feb 24 '06 #1
5 Replies

 P: n/a Fei Liu wrote: Hi, I have a interesting problem here, class absOP{ template T operator(T val) { return val < 0 ? -val : val; } Did you mean to write template 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(i); //error ai = op(i); //error ai = 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 using namespace std; struct abs_op { template 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 Feb 24 '06 #2

 P: n/a 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 T operator()(size_t index) { return *(reinterpret_castdata + 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 = x(3); //error float ele = x(3); //error float ele = x(3); //error I hope this made it clearer. Victor Bazarov wrote: Fei Liu wrote: Hi, I have a interesting problem here, class absOP{ template T operator(T val) { return val < 0 ? -val : val; } Did you mean to write template 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(i); //error ai = op(i); //error ai = 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 using namespace std; struct abs_op { template 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 Feb 24 '06 #3

 P: n/a 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 T operator(T val) { return val < 0 ? -val : val; }Did you mean to write template T operator()(T val) { return val < 0 ? -val : val; }? Notice the "empty set of parens" after the word 'operator'. It is alsodeclared 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); //errorai = op(i); //errorai = op(i); //errorai = op(i); //errorAlas, I tried a couple sane ways to use function template of overloadedoperator () but none seemed to work...Any idea or help is appreciated.This is covered by FAQ 5.8.#include using namespace std;struct abs_op { template 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 T operator()(size_t index) { return *(reinterpret_castdata + 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 = x(3); //error float ele = x(3); //error float ele = x(3); //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 T doit()(size_t index) ... }; float ele = x.doit(3); V -- Please remove capital As from my address when replying by mail Feb 24 '06 #4

 P: n/a 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. Feb 24 '06 #5

 P: n/a 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 struct type {}; struct S { template T operator()(type, size_t); }; int main(int ac, char** av) { S s; s(type(), 1); } Feb 25 '06 #6

### This discussion thread is closed

Replies have been disabled for this discussion. 