Logo Hardware.com.br
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas

[Resolvido] Template C++ (problema para linkar uma classe)

#1 Por tpcvasco 03/04/2006 - 00:42
Eu já programo há um tempo, mas não conheço mto de template e estou com problemas. Fiz um código simples de teste pra exemplificar a questão. Meu arquivo header (.h):


//Arquivo: myclass1.h

template <class T>
class myclass1 {
private:
T valor;

public:
myclass1(T v);
};


O .cpp está assim:


//Arquivo: myclass1.cpp

#include "myclass1.h"

template <class T>
myclass1<T>::myclass1(T v) {
valor = v;
}


Pq eu não consigo usar essa classe dessa forma:


//Arquivo: main.cpp

#include "myclass1.h"

int main (void) {
myclass1<int> *t = new myclass1<int>(10);
}


??????

Dá o seguinte erro:

/tmp/ccsweYqX.o(.text+0x2d): In function `main':
: undefined reference to `myclass1::myclass1[in-charge](int)'

Desculpe a ignorância, deve ser algo muto simples, mas q eu não consigo saber. Valeu qq ajuda.
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#3 Por tpcvasco
03/04/2006 - 02:56
Mas eu já faço exatamente isso! Essa é a minha compilação:

g++ -Wno-deprecated -c myclass1.cpp
g++ -Wno-deprecated -lm -o teste myclass1.o main.cpp

A primeira linha compila legal. O erro q eu mencionei ocorre no segundo g++.
Sua solução resolve sim, mas lembre-se q isso é só uma classe de teste, meu projeto é mto maior q isso, com mtas classes. Eu não posso ficar colocando todos os métodos em um unico arquivo junto com a main(), fica inviável. Além disso, oq eu quero deveria ser possível normalmente. Alguma outra sugestão?
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#6 Por jackinabox
03/04/2006 - 20:37
jqueiroz
Hummmmm, chego à conclusão de que eu não sei programar em C++. Qual a função desse "template"?

Você pode, por exemplo, fazer uma Queue genérica (ou um Vector, ou Stack, etc.), cujos elementos podem ser virtualmente de qualquer tipo (em vez de fazer uma Queue que pode conter int, outra que pode conter objetos do tipo Pessoa, etc.

Dei como exemplo a criação de containers genéricos, mas serve para outras coisas também. O "template" define o comportamento genérico, e o tipo é especificado em runtime. Da mesma forma que os "Generics" em Java.
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#9 Por jackinabox
04/04/2006 - 12:53
EDITADO

jqueiroz
Generics??? Xi, acabo de descobrir que também não sei programar Java, então.

big_green.png Feature nova do Java 5 (juntamente com outras novas features como enums, autoboxing/unboxing, "for each", annotations, etc.).

Seria algo como uma classe Abstrata???

Não. Na realidade, é uma feature suportada pela linguagem para permitir que se defina um comportamento que seja aplicável a um tipo arbitrário. Por exemplo, não importa que tenhamos uma List de int, ou de float, ou de Cliente ou de Mensagem, uma List comporta-se como uma List, independentemente dos elementos nela armazenados.

Os exemplos mais comuns envolvem justamente o uso de collections (Lists, Sets, etc.), mas os Generics não estão limitados a esse uso. No caso das collections, que fazem parte das bibliotecas Java, as classes e interfaces List, Set, ArrayList, HashSet, etc., já foram previamente "generified", pois são parte da biblioteca padrão.

Se formos olhar o código fonte da interface List, por exemplo, encontraremos

public interface List<E> extends Collection<E>


O "E" é justamente o tipo variável. A grosso modo, essa declaração diz algo como "declare-se uma List de elementos do tipo E. Essa List é uma subclasse de Collection, também por sua vez de elementos do tipo E". Qual tipo é o tipo "E"? Não importa nesse contexto. Mas se criarmos uma lista especificando um tipo, por exemplo, como

List<BeautifulGirl> lista1;

então somente elementos do tipo BeautifulGirl poderão ser armazenados na lista1.

Mas a idéia é que o programador pode definir seus próprios tipos genéricos, quando for aplicável. Um exemplo que não seja collection? A criação de um DAO (Data Access Object) que suporte operações CRUD em um tipo arbitrário de dados, por exemplo.
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#10 Por tpcvasco
04/04/2006 - 12:54
Sim, mas e o meu caso? Pq eu não consigo usar a classe dakela forma, oq eu estou fazendo de errado?

tcpl, jackinabox, alguém, algum help?
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#11 Por tpcvasco
04/04/2006 - 22:23
Bom, como ninguém me deu uma resposta e eu precisava dela urgente, resolvi colocar a mão na massa e procurar no Google mais do q eu já tinha procurado. Primeiro eu encontrei esse FAQ:
http://www.codeguru.com/forum/showthread.php?t=250284

A dúvida é a mesma q eu tinha. O cara explica bem o motivo do problema e dá duas soluções: usando export e usando inline. Porém nenhuma delas funcionou no meu compilador.

Então, depois de muitas buscas q não deram em nada, com um pouco mais de paciência e sorte, acabei encontrando esse fórum:
http://cboard.cprogramming.com/archive/index.php/t-49829.html

Mais uma vez, exatamente a mesma dúvida. Mas dessa vez finalmente alguém postou uma resposta q funcionou, a resposta do membro xErath.

Vou colocar aki a solução q ele deu:

------------- ARQUIVO .h ---------------

#ifndef _FILE_H_
#define _FILE_H_

/*
declarações, commentários e oq mais quiser
*/
#include "file.cpp"

#endif //_FILE_H_


-------------- ARQUIVO .cpp -------------

#ifdef _FILE_H_
/*
código com templates, funções inline
- parte compilada somente quando o arquivos está incluído no .h
*/
#else
#include "file.h"
/*
código sem template
*/
#endif //_FILE_H_


Bem, isso resolveu meu problema de uma maneira bem clara e elegante. Vou deixar postado aki para quem tiver o mesmo problema. Espero ter ajudado e obrigado a mim mesmo :wink:
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal