samedi 29 avril 2017

Is this nested template base class ambiguous?

This code used to compile in Clang 3.8, and still compiles in VS 2017, but started emitting an error in 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 says

<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&)
     ^

All three compilers in action: http://ift.tt/2qpQwjl

I want f(A()) to deduce D = A, I... = <> and f(B()) to deduce D = B, I... = A, which is then deducible as an instance of impl. 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?

Aucun commentaire:

Enregistrer un commentaire