C ++ retornando classe aninhada com modelo no problema classe base
Pergunta
Eu estou tentando criar um objeto da lista, com a classe iterator dentro aninhada para entender como ele funciona. Em algum método, eu estou tentando retornar um objeto iterador, mas ele não funciona. Eu criei um exemplo para mostrar o problema:
// CLASS A
template <class T>
class A
{
public:
class B;
A(){}
};
// CLASS B
template <class T>
class A<T>::B
{
private:
int varB;
public:
B(B& b);
B(const int&);
B returnThis();
};
template <class T>
A<T>::B::B(const int& value)
{
varB = value;
}
template <class T>
A<T>::B::B(B& b)
{
varB = b.varB;
}
template <class T>
A<T>::B A<T>::B::returnThis()
{
return *this;
}
// MAIN
void main()
{
A<int>::B classB(10);
}
O erro está perto dessas linhas:
template <class T>
A<T>::B A<T>::B::returnThis()
O compilador me diz que eu estou faltando um; antes de A :: B :: returnThis ()
Eu estou tentando resolver este problema por dias e não consigo encontrar uma maneira de fazê-lo funcionar ... Eu realmente aprecio alguma ajuda. Agradecemos antecipadamente!
Solução
Você precisa typename
:
typename A<T>::B
Para indicar ao compilador que A<T>::B
é um tipo. Aqui está um boa explicação porquê.
O que B
é depende do que A<T>
é, isso é chamado de dependência. Toda vez que você está recebendo um tipo de fora de uma classe ou estrutura, e é dependente de um modelo, você vai precisar usar typename
.