I have a problem related to type deduction from a function return value.
First, some context, to show what I expect. Say I have this function template:
template <typename T1, typename T2>
T1 foo( T2 t )
{
T1 a = static_cast<T1>(t); // dummy conversion,
return a; // just there to use t
}
then, this does not build, because return type can't be used for type deduction:
int a;
float v1 = foo(a);
char v2 = foo(a);
But if I add the requested type, then it's okay:
int a;
auto v1 = foo<float>(a);
auto v2 = foo<char>(a);
Now my problem. I have a class, that provides a getter to some data:
template<typename T>
struct MyClass
{
T data;
template<typename U>
U get() { return static_cast<U>(data); } // dummy code, returns an 'U'
};
User code can fetch the data with this (builds fine):
MyClass<int> m;
auto v3 = m.get<float>();
But I want to provide to user code a second way to access the data, by using a free function, so one can write:
MyClass<int> m;
auto v4 = ff_get<float>(m);
The question is:
How do I write ff_get()?
I tried:
template <typename T1, typename T2>
T1 ff_get( T2 t )
{
return t.get<T1>();
}
But this will not build, although it seems to me is uses the same syntax as the foo call above. So second part of the question is: why does this fail?
(see live code)