Newsgroup: it.comp.lang.c++
Titolo: private member template initialization

Ciao a tutti.
Il seguente pezzetto di codice, che mi compilava con il gcc <= 3.3.0, non mi compila piu' con il gcc 3.3.1:
-------------------------------------------------------------
template < typename T >
class Singleton
  {
  private:
    Singleton() {}
    static Singleton instance;
  public:
    static Singleton& getInstance() { return instance; }
  };
template < typename T > Singleton<T> Singleton<T>::instance;
Singleton<int>& a = Singleton<int>::getInstance();
--------------------------------------------------------------
L'errore che ritorna e' di questo tipo:
test.cc: In instantiation of `Singleton<int> Singleton<int>::instance':
test.cc:9:   instantiated from `static Singleton<T>& Singleton<T>::getInstance() [with T = int]'
test.cc:15:   instantiated from here
test.cc:5: error: `Singleton<T>::Singleton() [with T = int]' is private
test.cc:12: error: within this context
Anche il Comeau C++ (online) compila semza lamentarsi...
Inizializzare in questo modo i membri *static* mi sembra corretto, e per una classe non-template 
il codice corrispondente funziona correttamente. 
Non riesco a capire se la nuova versione del compilatore ha deliberatamente vietato la cosa 
o se si tratta di un errore. Non ho avuto modo di provare il nuovo gcc 3.3.2.
Qualche consiglio?
Grazie.
Francesco.


prova a farlo con i puntatori (non testato):
template <typename T>
class Singleton {
protected:
    Singleton() {}
private:
    static Singleton<T>* instance;
public:
    static Singleton<T>* getInstance() {
        if(instance==0)
            instance=new Singleton<T>;
        return instance;
    }
};
template <typename T>
Singleton<T>* Singleton<T>::instance=0;
Singleton<int>* a=Singleton<int>::getInstance();
-- 
Pela

 
Uhm?
Si, grazie. In realta' il singleton lo posso implementare anche in altri
modi, era l'errore in se che mi lasciava perplesso.
Soprattutto perche' per altri compilatori il codice in questione e'
lecito...
Ciao!

Anche col g++ 3.3.2 da lo stesso errore, ed effettivamente togliendo il 
template l'errore scompare. Lascia alquanto in dubbio pure me - se 
qualcuno ha lumi... :P
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

 
Nel frattempo (oltre ad aver scoperto che nel laboratorio in fondo al
corridoio ci sono 5 macchine con il gcc 3.3.2 ...) ho ridotto hai minimi
termini il codice che genera l'errore:
------------------------------------------------------
template < typename T >
class Aclass
  {
  private:
    Aclass() {}
    static Aclass instance;
  };
template < typename T > Aclass<T> Aclass<T>::instance;
//Aclass<int> Aclass<int>::instance;
template class Aclass<int>;
------------------------------------------------------
Se si decommenta l'istanziazione esplicita di Aclass<int>::instance il
codice compila...
Che ne pensate?

 qualcuno ha lumi... :P
Ho due consigli:
1) Cercare qui: 
http://gcc.gnu.org/bugzilla/
2) Chiedere su comp.lang.c++.moderated
Sono curioso anch'io di conoscere il risultato :-)
Ciao,
Nicola

 2) Chiedere su comp.lang.c++.moderated
Ho postato su comp.lang.c++, e mi e' stato risposto di provare a postare su
qualche gnu.g++.*
Oggi purtroppo non ho molto tempo, quindi penso che rimandero' a lunedi'.
Se qualcuno vuole provare nel frattempo...
Ciao!

 Sono curioso anch'io di conoscere il risultato :-)
Ehila!
Ho cercato un po' qua e la', ma non ho trovato granche'. Su bugzilla del g++
c'e' qualche bug simile, ma niente che coinvolga classi con costruttore
privato...
Alla fine ho deciso di postare il problema come bug, al massimo mi tireranno
dei nomi se non lo e' ;-)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13262
Ciao!

 wrote in message news:<bqg0bo$q70$1...@localhost.localdomain>...

Ben fatto. Mi pare che il minimo contributo che si possa dare allo
sviluppo di strumenti open source e' segnalare precisamente eventuali
bachi. E se lo sforzo di cercarlo prima e' stato compiuto, l'eventuale
duplicato sara' uno stimolo a rendere la ricerca piu' efficace :-)
Ciao,
Nicola