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<Grupo>::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 < Grupo > :: 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<Grupo> 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.