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