I have following code:
template <typename T>
class A
{
typedef typename T::Type MyType;
};
template <typename T>
class B : public A<B<T>>
{
typedef T Type;
};
When I try to instantiate B, I get following error message using MSVS 2015:
'Type': is not a member of 'B<int>'
Is this code valid C++ or is MSVS right?
The problem is at this point
template <typename T>
class A
{
typedef typename T::Type MyType;
^^^
};
T needs to be a complete type. But in your case, when A<T> is instantiated here:
template <typename T>
class B : public A<B<T>>
^^^^^^^
B<T> is not yet a complete type! So this cannot work unfortunately.
The simple solution is just to pass in Type separately:
template <typename T, typename Type>
class A
{
typedef Type MyType;
};
template <typename T>
class B : public A<B<T>, T>
{
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With