What is wrong with the following piece of code?
#include
template
struct A {
struct X { K p; };
struct Y { K q; }
The argument K
in const typename A
is not deducible. Basically, everything left of a ::
is not deducible (if ::
separates a nested-name).
It's trivial to see why it makes no sense to ask for deduction by running through this thought experiment:
struct A { typedef int type; }
struct B { typedef int type; }
template void foo(typename T::type);
foo(5); // is T == A or T == B ??
There's no one-to-one mapping from types to nested types: Given any type (such as int
), there could be many ambient types of which it is a nested type, or there needn't be any.