Function template passed as typename argument?
-
Hi I just recently learned about templates in C++, and I find it very useful and simple to use. I have one question though on a (possibly toy) problem. Let's say I have the following declarations: int maxint(int o1, int o2) {return (o1 > o2 ? o1 : o2);} template arg Fun(arg i1, arg i2, T func) { return func(i1, i2); } and I invoke Fun in main() as follows: cout << Fun(a, b, maxint) << endl; where a and b are integers. This compiles and works without any error. But let's say I want to generalize maxint, and I create the following function template: template T maxi(T o1, T o2){return (o1 > o2 ? o1: o2);} The linker always complains about unresolved external symbol "int __cdecl maxi(int,int)" when I tried to invoke maxi in main() with the following: cout << Fun(a, b, maxi) << endl; Could anyone tell me what I did wrong, and how I can rectify it? Thanks!
-
Hi I just recently learned about templates in C++, and I find it very useful and simple to use. I have one question though on a (possibly toy) problem. Let's say I have the following declarations: int maxint(int o1, int o2) {return (o1 > o2 ? o1 : o2);} template arg Fun(arg i1, arg i2, T func) { return func(i1, i2); } and I invoke Fun in main() as follows: cout << Fun(a, b, maxint) << endl; where a and b are integers. This compiles and works without any error. But let's say I want to generalize maxint, and I create the following function template: template T maxi(T o1, T o2){return (o1 > o2 ? o1: o2);} The linker always complains about unresolved external symbol "int __cdecl maxi(int,int)" when I tried to invoke maxi in main() with the following: cout << Fun(a, b, maxi) << endl; Could anyone tell me what I did wrong, and how I can rectify it? Thanks!
Problem 1: Your template functions aren't quite right (I didn't notice at first myself) They should look like this
template <typename arg, typename T> arg Fun(arg i1, arg i2, T func) { return func(i1, i2); } template <typename T> T maxi(T o1, T o2) { return (o1 > o2 ? o1: o2); }
Problem 2: You can't use a function template as a function argument. That means the even with the correct definitions, it still won't work. Harrumph! Solution: Functors are like functions and classes all in one go - the STL uses them in the collection classes to order elements. I re-wrote the functions like this...#include <iostream>
using namespace std;
template <typename T>
struct Maxi
{
T operator () (T o1, T o2)
{
return (o1 > o2 ? o1: o2);
}
};template <typename arg, typename Func = Maxi <arg> >
struct Fun
{
arg operator () (arg i1, arg i2)
{
Func func;
return func(i1, i2);
}
};int main(int argc, _TCHAR* argv[])
{
int a (10), b (15);
Fun <int> fun;cout << fun(a, b) << endl; return 0;
}
Lo and behold, I get 15 as my output! Ask anything you're unclear about and I'll try and clarify :)
-
Hi I just recently learned about templates in C++, and I find it very useful and simple to use. I have one question though on a (possibly toy) problem. Let's say I have the following declarations: int maxint(int o1, int o2) {return (o1 > o2 ? o1 : o2);} template arg Fun(arg i1, arg i2, T func) { return func(i1, i2); } and I invoke Fun in main() as follows: cout << Fun(a, b, maxint) << endl; where a and b are integers. This compiles and works without any error. But let's say I want to generalize maxint, and I create the following function template: template T maxi(T o1, T o2){return (o1 > o2 ? o1: o2);} The linker always complains about unresolved external symbol "int __cdecl maxi(int,int)" when I tried to invoke maxi in main() with the following: cout << Fun(a, b, maxi) << endl; Could anyone tell me what I did wrong, and how I can rectify it? Thanks!
Template functions do not exist unless they are called explicitly in your code. In your case, passing the address of a template function will compile because the function has been declared, but because it is not explicitly called anywhere, it is not defined, and is therefore unable to be found during linking. The solution is to call the function for
int
s at least once, or write a specialisation of the template function forint
s:template<> int maxi(int o1, int o2) { return (o1 > o2 ? o1 : o2); }
Hope this helps,
Ryan
"Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
-
Problem 1: Your template functions aren't quite right (I didn't notice at first myself) They should look like this
template <typename arg, typename T> arg Fun(arg i1, arg i2, T func) { return func(i1, i2); } template <typename T> T maxi(T o1, T o2) { return (o1 > o2 ? o1: o2); }
Problem 2: You can't use a function template as a function argument. That means the even with the correct definitions, it still won't work. Harrumph! Solution: Functors are like functions and classes all in one go - the STL uses them in the collection classes to order elements. I re-wrote the functions like this...#include <iostream>
using namespace std;
template <typename T>
struct Maxi
{
T operator () (T o1, T o2)
{
return (o1 > o2 ? o1: o2);
}
};template <typename arg, typename Func = Maxi <arg> >
struct Fun
{
arg operator () (arg i1, arg i2)
{
Func func;
return func(i1, i2);
}
};int main(int argc, _TCHAR* argv[])
{
int a (10), b (15);
Fun <int> fun;cout << fun(a, b) << endl; return 0;
}
Lo and behold, I get 15 as my output! Ask anything you're unclear about and I'll try and clarify :)
excuse me but
template <typename T>T maxi(T o1, T o2){return (o1 > o2 ? o1: o2);}
and
template <typename T>
T maxi(T o1, T o2)
{
return (o1 > o2 ? o1: o2);
}are the same !!! where do you see a difference ? the new line ? mwuaaahhahhh. whites spaces are ignored by the C/C++ compilers. didn't you know that ?
TOXCCT >>> GEII power
-
Hi I just recently learned about templates in C++, and I find it very useful and simple to use. I have one question though on a (possibly toy) problem. Let's say I have the following declarations: int maxint(int o1, int o2) {return (o1 > o2 ? o1 : o2);} template arg Fun(arg i1, arg i2, T func) { return func(i1, i2); } and I invoke Fun in main() as follows: cout << Fun(a, b, maxint) << endl; where a and b are integers. This compiles and works without any error. But let's say I want to generalize maxint, and I create the following function template: template T maxi(T o1, T o2){return (o1 > o2 ? o1: o2);} The linker always complains about unresolved external symbol "int __cdecl maxi(int,int)" when I tried to invoke maxi in main() with the following: cout << Fun(a, b, maxi) << endl; Could anyone tell me what I did wrong, and how I can rectify it? Thanks!
-
excuse me but
template <typename T>T maxi(T o1, T o2){return (o1 > o2 ? o1: o2);}
and
template <typename T>
T maxi(T o1, T o2)
{
return (o1 > o2 ? o1: o2);
}are the same !!! where do you see a difference ? the new line ? mwuaaahhahhh. whites spaces are ignored by the C/C++ compilers. didn't you know that ?
TOXCCT >>> GEII power
Yeah they're the same, when I did my original cut'n'paste though I thought I read
template T maxi(T o1, T o2){return (o1 > o2 ? o1: o2);}
I do apologise for any confusion there:-O Though since we're on templates, I feel I need to clarify your statement about white-space... In a statement such as
std::map <std::string, std::vector<int> >
you really need that space between the >'s or the compiler thinks it's a shift-right operator
std::map <std::string, std::vector<int>> //Error!!