从2个模板类继承`sameFunctionName <T>`==>不明确

问题描述

我有C<T>负责管理特定的原始类型T
为了方便使用,我想将C<int>C<float>的所有功能归为Utility

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
我希望Utility::foo(bInt)C<int>::foo(bInt)的含义相同,但出现此错误:-

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]'
 

我不想更改foo调用方式。
除了不编译外,我喜欢它的样子。
看来编译器无法推断并调用正确的T函数。 如何解决编译错误

请注意,我在C中有很多功能
cigien 解决方效果很好,除了它对我的情况而言可能很乏味。

类似的问题:Ambiguous multiple inheritance of template classes(对于我的情况而言非常繁琐)

解决方法

您可以将所需的foo的特定版本引入C,如下所示:

class Utility : public C<int>,public C<float>
{
  public:
    using C<int>::foo;
    using C<float>::foo;
};

现在,模板参数推导可以推断出调用权foo

这里是demo

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...