I have the following template class & sample classes :
template<typename A, typename B, typename C = typename A::Nested<B>>
struct X
{
X()
{
std::cout << "A is : " << A::who() << std::endl;
std::cout << "B is : " << B::who() << std::endl;
std::cout << "C is : " << C::who() << std::endl;
}
};
struct Bsample
{
static const char* who() { return "Bsample"; }
};
struct Asample
{
template<typename B>
struct Nested;
template<>
struct Nested<Bsample>
{
static const char* who() { return "Asample::Nested<Bsample>"; }
};
static const char* who() { return "Asample"; }
};
X<Asample, Bsample>
C
Asample::Nested<Bsample>
prog.cpp:4:65: error: expected '>' before '<' token
template<typename A, typename B, typename C = typename A::Nested<B>>
^
C
template
typename
You need both typename
and template
here:
template<typename A, typename B, typename C = typename A::template Nested<B>>
The template
says than A::Nested
is a template, and the typename
says that A::Nested<B>
names a type.
You also need to move the specialization of Asample::Nested
out of the Asample
definition:
struct Asample
{
template<typename B>
struct Nested;
static const char* who() { return "Asample"; }
};
template<>
struct Asample::Nested<Bsample>
{
static const char* who() { return "Asample::Nested<Bsample>"; }
};