Newsgroup: it.comp.lang.c++
Titolo: Su DevC++ va bene, ma su Linux no!??!

Salve ragazzi, sono un principiante di c++. Volevo chidervi un aiutino. Il
codice che ora elenco č una bozza di una classe Coda, magari con qualche
errore logico. Bene non so perchč sul DevC++ di windows il compilatore non
mi da nessun errore, mentre su qualsiasi versione del g++ su Linux mi da il
seguente errore:"undefined reference to
'Coda::Coda[in-charge](std::vector<int, std::allocator<int> >)'".
------------------------------------------------------------
Coda.h:
#include <vector>
#include <string>
#include "Nodo.h"
class Coda {
public:
Coda(vector<int>);
Nodo* insert(int);
bool isEmpty() {return testa==0;}
private:
Nodo *testa;
} ;
------------------------------------------------------------
Coda.cpp:
#include <vector>
#include <string>
#include "Coda.h"
#include "Nodo.h"
Coda::Coda(vector<int>v) {
for(int i=v.size()-1; i>0; i--)
insert(v[i]);
testa=insert(v[0]);
}
Nodo* Coda::insert( int i ) {
Nodo *p=new Nodo(i);
if(isEmpty())
testa=p;
else {
p->right=testa;
testa->left=p;
testa=p;
}
return testa;
}
------------------------------------------------------------
Nodo.h:
#ifndef _CODA_H
#define _CODA_H
class Nodo {
public:
friend class Coda;
Nodo(): elemento(0), left(0), right(0){}
Nodo(int i): elemento(i), left(0), right(0){}
Nodo(const Nodo& );
int getElement(){return this->elemento;}
private:
int elemento;
Nodo *left;
Nodo *right;
};
#endif
------------------------------------------------------------
Nodo.cpp:
#include "Nodo.h"
Nodo::Nodo(const Nodo& n){
elemento=n.elemento;
left=n.left;
right=n.right;
}
------------------------------------------------------------
Main.cpp:
#include <iostream.h>
#include <vector.h>
#include <string>
#include "Nodo.h"
#include "Coda.h"
int main() {
vector<int>v(2,4);
Coda f(v); // <-- quando viene invocato il costruttore appare l'errore che
ho detto prima, ma solo sul g++!!??
Nodo test(5);
cout << test.getElement();
system("PAUSE");
return 0;
}
Grazie..

 std::allocator<int> >)'".
Il problema è che devi indicare al linker dove sta
l'implementazione di Coda(std::vector<int>);
Mentre questo viene probabilmente fatto automaticamente dal
DevC++, quando usi il g++ a linea di comendo devi specificare
quali file oggetto vanno usati.
Al momento non ricordo la sintassi esatta da usare col g++,
ma, per esempio, col Borland C++ Compiler 5.6 fai:
bcc32 Coda.cpp  (questo crea Coda.obj)
bcc32 Nodo.cpp  (questo crea Nodo.obj)
bcc32 Main.cpp Coda.obj Nodo.obj (questo crea Main.exe)
Aggiungo infine il tuo codice con un po' di correzioni
N.B. Non ho guardato la logica, ma solo la correttezza sintattica
// Coda.h
#include <vector>
#include "Nodo.h"
class Coda
{
    public:
    Coda(std::vector<int>);
    Nodo* insert(int);
    bool isEmpty() {return testa==0;}
    private:
    Nodo *testa;
} ;
// Coda.cpp
#include <vector>
#include "Coda.h"
#include "Nodo.h"
Coda::Coda(std::vector<int>v)
{
    for(int i=v.size()-1; i>0; i--)
        insert(v[i]);
    testa=insert(v[0]);
}
Nodo* Coda::insert( int i )
{
    Nodo *p=new Nodo(i);
    if(isEmpty())
        testa=p;
    else
    {
        p->right=testa;
        testa->left=p;
        testa=p;
    }
    return testa;
}
// Nodo.h
#ifndef NODO_GIUSEPPE_H
#define NODO_GIUSEPPE_H
class Nodo
{
    public:
    friend class Coda;
    Nodo(): elemento(0), left(0), right(0){}
    Nodo(int i): elemento(i), left(0), right(0){}
    Nodo(const Nodo& );
    int getElement(){return this->elemento;}
    private:
    int elemento;
    Nodo *left;
    Nodo *right;
};
#endif
// Nodo.cpp
#include "Nodo.h"
Nodo::Nodo(const Nodo& n)
{
    elemento=n.elemento;
    left=n.left;
    right=n.right;
}
// Main.cpp
#include <iostream>
#include <vector>
#include "Nodo.h"
#include "Coda.h"
int main()
{
    std::vector<int>v(2,4);
    Coda f(v);
    Nodo test(5);
    std::cout << test.getElement();
}
--
Gerolamo

 Il problema č che devi indicare al linker dove sta
