微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?