该代码曾经在Clang 3.8中进行编译,并且仍在VS 2017中进行编译,但是在Clang 3.9中开始发出错误。

template <typename D, typename ... I>
struct impl : I ...
{};

template <typename D, typename ... I>
void f(impl<D, I...> const&)
{}

struct A : impl<A> {};
struct B : impl<B, A> {};

int main()
{
    f(A());
    f(B()); // Error
}

铛3.9说
<source>:15:5: error: no matching function for call to 'f'
    f(B());
    ^
<source>:6:6: note: candidate template ignored: failed template argument deduction
void f(impl<D, I...> const&)
     ^

所有这三个编译器都在起作用:
https://godbolt.org/g/OKFpPl

我希望f(A())推断D = A, I... = <>f(B())推断D = B, I... = A,然后将其推导为impl的实例。我的最终目标是检测impl的参数包中的类型,这些参数包本身就是impl的实例。我会以错误的方式处理吗?

最佳答案

不确定,但是...

您的B类继承自impl<B, A>,而impl<A>继承自B

因此impl<D, I...>继承自几个不同的D == B基类,因此类型推导是不明确的(I... == <A>D == AI... == <>和ojit_code)。

所以我认为clang 3.8是错误的,而3.9是正确的。



是的,您做错了方式(我认为)。

关于c++ - 此嵌套模板基类是否不明确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43691363/

10-13 06:50