[RESOLVIDO] C++ Lista tipada (templates)

Dai pessoal, tranquilo?

Criei a seguinte classe:

#ifndef GrupoH
#define GrupoH

#include <vcl.h>

template<class T>
class Grupo
{
public:
       Grupo();
       ~Grupo();

       int      id;
       int      codigo;

       String   nome;
       String   faixaId;

       bool     excluido;
};

#endif

Gostaria de saber como usa-la com uma List, tentei aqui da seguinte forma:

list<Grupo> grupos = new list<Grupo>;

Mas obtenho o seguinte erro:

[C++ Error] Grupo.cpp(4): E2102 Cannot use template ‘Grupo’ without specifying specialization parameters

Se alguém puder ajudar,

[]s

Por que é que você indicou que a classe Grupo é um template? Não vejo nenhuma indicação de você usar o tipo T dentro de sua classe Grupo.

Para usar sua classe em um std::list<Grupo> você não precisa indicar que sua classe é templatizada.

Olá thingol,

Eu tinha entendido lendo alguns artigos que seria necessário, devo
ter confundido.

Valeu a dica vou tentar aqui sem templatizar minha classe e retorno
sobre o resultado.

[]s

Agora estou obtendo outro erro, vou mostrar como estou tentando utilizar a lista:

void __fastcall GrupoDAL::listar()
{
        grupos = new list<Grupo>;

        Grupo grupoAtual;

        if(mySql.db_query(SELECT_GRUPOS))
        {
            grupos<Grupo>::iterator it;

            for(it = grupos.begin(); it != grupos.end(); ++it)
            {
                grupoAtual = *it;
            }
        }
}

Na linha 9:
[C++ Error] GrupoDAL.cpp(83): E2108 Improper use of typedef ‘Grupo’
[C++ Error] GrupoDAL.cpp(83): E2102 Cannot use template ‘iterator<_Category,_Tp,_Distance,_Pointer,_Reference>’ without specifying specialization parameters
[C++ Error] GrupoDAL.cpp(83): E2379 Statement missing ;

E aqui está o .h da classe que contém o método acima.

#ifndef GrupoDALH
#define GrupoDALH
#include <vcl.h>
#include "CMySQL.h"
#include "Grupo.h"
#include <list.h>

class GrupoDAL: public CMySQL
{
public:
       GrupoDAL();
       ~GrupoDAL();

       CMySQL             mySql;

       TMemoryStream      * memoryStream;
       TStringList        * dadosDoBanco;

       Grupo              * grupo;
       list<Grupo>        * grupos;

       void __fastcall GrupoDAL::inserir();

       Grupo * __fastcall recuperar(Grupo grupo);

       void __fastcall listar();

       void __fastcall atualizar();

       void __fastcall remover();
};

Não entendo porque o compilador não me deixa utilizar o tipo Grupo e faz referências a templates( agora já não indico que a classe Grupo é template =] ).

a) Tire essa ______ de __fastcall, você não precisa disso

b) Que história é essa de

grupos&lt;Grupo&gt;::iterator it; 

O correto é ter um tipo para declarar uma variável, não uma mistura como você fez (pôs um nome de variável - grupos - à esquerda e à direita pôs outro nome - it. Acho que você queria fazer isto aqui:

for (list &lt; Grupo &gt; :: iterator it = grupos.begin(); it != grupos.end(); it++) 
{
    ...
}

Mais atenção! (e aprenda a ter um pouco de cuidado com as mensagens de erro do compilador C++. Diferentemente do compilador Java, as mensagens são extremamente difíceis de entender, portanto o correto é fazer as coisas sempre certo; se o compilador lhe indica um erro, você sabe que está errado, mas é difícil dizer o que está errado só comas mensagens de erro.
Você precisa consultar o livro de C++ e a documentação.

Outra coisa - a vida já é muito complicada, porque complicá-la mais com ponteiros? O objetivo de todo programador C++ “pro” é mandar os ponteiros para os infernos, e usar apenas classes.

 class GrupoDAL: public CMySQL  
 {  
 public:  
        GrupoDAL();  
        ~GrupoDAL();  
        ...
        list&lt;Grupo&gt;        grupos;  // não use ponteiros, por favor - faça um favor a si mesmo, e evite ponteiros.
   

Realmente aquela história do iterator estava errada, obrigado, vou ter mais atenção.

Tenho aqui o livro Programando em C++ A Bíblia, mas não achei nada sobre list,
têm algum livro que você recomenda?

Obrigado, e vou evitar o uso de ponteiros também…

Tem uma lista completa de livros recomendados aqui:
http://vinigodoy.wordpress.com/roadmap-c

Veja o livro de STL, muito bom.

Esse livro é bem velhinho - tem 10 anos; nesse tempo, não estava na moda a STL e se bobear não tem nem templates.

Você pode arranjar um livro mais novo, como o livro do Deitel sobre C++ (que é melhor que o livro deles sobre Java).

De qualquer maneira, se você não quer gastar um tostão e quer aprender bem STL, procure por STL e também dê uma olhadinha no FAQ do C++:

http://www.arnaut.eti.br/op/CPPFL00.htm (traduzido), http://www.parashift.com/c++-faq-lite/ (original).

Obrigado thingol, e ViniGodoy!

Agora vou entrar no caminho correto para aprender melhor C++
já estou entendendo melhor o mapa de aprendizado.