TemplateArgument f(const TemplateType& arg) { return Tem-6ren">
gpt4 book ai didi

c++ - "Ambiguous base class"模板上下文错误

转载 作者:IT老高 更新时间:2023-10-28 23:01:08 26 4
gpt4 key购买 nike

我有这个函数模板:

template <class TemplateArgument, template<class> class TemplateType>
TemplateArgument f(const TemplateType<TemplateArgument>& arg)
{
return TemplateArgument();
}

这样使用,编译失败:

struct A {};
template <typename T> struct S {};
template <typename T> struct B : public S<T> {};

struct C : public B<A> {};

int main()
{
f(C());
return 0;
}

错误信息是:

<source>: In function 'int main()':

<source>:15:10: error: no matching function for call to 'f(C)'

f(C());

^

<source>:2:18: note: candidate: template<class TemplateArgument, template<class> class TemplateType> TemplateArgument f(const TemplateType<TemplateArgument>&)

TemplateArgument f(const TemplateType<TemplateArgument>& arg)

^

<source>:2:18: note: template argument deduction/substitution failed:

<source>:15:10: note: 'const TemplateType<TemplateArgument>' is an ambiguous base class of 'C'

f(C());

^

发生在 GCC(任何版本)和 clang(任何版本)中。 MSVC 不会发生这种情况。现场演示:https://godbolt.org/g/eWxeHJ

为什么会出现这个错误?我没有看到任何歧义,“歧义基类”错误通常发生在多重继承情况下,不是吗?如何使我的代码编译(正确推断模板参数)?

请注意,我无法编辑 ABCS 类及其与每个类的关系其他,我只能编辑我的函数 f() 以正确接受这些类。

最佳答案

编译器不确定是否推演arg s 类型为 B<A>S<A> .我不确定这个具体案例,但众所周知,MSVC 违反了标准,尤其是在涉及模板时。

至于您的功能,您需要通过显式转换为适当的基数自行解决这种歧义:

f((const B<A> &)C());

或通过显式指定模板参数:

f<A, B>(C());

通常,只要语言中存在任何歧义,编译器永远不会自动解决它,因为这只是对用户究竟想要什么的推测,在某些情况下可能是正确的,而在其他情况下可能完全错误。

关于c++ - "Ambiguous base class"模板上下文错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com