该代码曾经在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 == A
或I... == <>
和ojit_code)。
所以我认为clang 3.8是错误的,而3.9是正确的。
是的,您做错了方式(我认为)。
关于c++ - 此嵌套模板基类是否不明确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43691363/