这个嵌套模板 base class 有歧义吗?
Is this nested template base class ambiguous?
此代码用于在 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
}
Clang 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
class 继承自 impl<B, A>
继承自 impl<A>
.
所以 B
从几个不同的 impl<D, I...>
基础 class 继承,所以类型推导是不明确的(D == B
和 I... == <A>
或 D == A
和 I... == <>
).
所以我认为 clang 3.8 是错误的,而 3.9 是正确的。
My end goal is to detect type in impl's parameter pack that are themselves instances of impl. Am I going about this the wrong way?
是的,你做错了(我认为)。
此代码用于在 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
}
Clang 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
class 继承自 impl<B, A>
继承自 impl<A>
.
所以 B
从几个不同的 impl<D, I...>
基础 class 继承,所以类型推导是不明确的(D == B
和 I... == <A>
或 D == A
和 I... == <>
).
所以我认为 clang 3.8 是错误的,而 3.9 是正确的。
My end goal is to detect type in impl's parameter pack that are themselves instances of impl. Am I going about this the wrong way?
是的,你做错了(我认为)。