I have C<T> that manage a specific primitive type, T.
I want to group all functions of C<int> and C<float> into Utility for my ease of usage.
template<typename T> class B{};
template<typename T> class C{
public: static void foo(B<T> bt){}
/** complex implemention in .cpp (I use explicit instantiation) */
/** a lot of functions!!!!!, each one with a lot of parameters */
};
class Utility: public C<int>,public C<float>{};
int main(){
B<int> bInt;
Utility::foo(bInt); //I don't want to change this line
}
Coliru MCVE
I expect Utility::foo(bInt) to have same meaning as C<int>::foo(bInt), but I got this error :-
main.cpp: In function 'int main()':
main.cpp:9:14: error: reference to 'foo' is ambiguous
9 | Utility::foo(bInt); //I don't want to change this line
| ^~~
main.cpp:3:25: note: candidates are: 'static void C<T>::foo(B<T>) [with T = float]'
3 | public: static void foo(B<T> bt){}
| ^~~
main.cpp:3:25: note: 'static void C<T>::foo(B<T>) [with T = int]'
I don't want to change how foo is called.
I like the way it is, except that it doesn't compile.
It looks like compiler fail to deduce and call a correct T-function.
How to fix the compile error?
Note that I have many functions inside C.
cigien's solution works well, except that it can be tedious for my case.
Similar question : Ambiguous multiple inheritance of template classes (very tedious for my case)