如何解决从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 举报,一经查实,本站将立刻删除。