2010-10-05 9 views
7

Próbuję znaleźć prawidłowy sposób inicjowania statycznej zmiennej kontenera, której wartością jest prywatna klasa wewnętrzna. Oto przykład zabawkaJak zainicjalizować statyczny kontener szablonowy?

#include <vector> 

using namespace std; 

template <class myType> 
class Foo { 
private: 
    class Bar { 
     int x; 
    }; 

    static vector<Bar*> bars; 
}; 

template <class myType> 
vector<Bar*> Foo<myType>::bars; // error C2065: 'Bar' : undeclared identifier 

Próbowałem zostały również

... 

template <class myType> 
vector<Foo<myType>::Bar*> Foo<myType>::bars; // error C2059: syntax error : '>' 

Działa jeśli class Bar jest zadeklarowana poza class Foo ale z punktu widzenia konstrukcji jest to brzydki rozwiązanie. Jakieś sugestie?

FYI, wszystko jest zadeklarowane w pliku .h.

Odpowiedz

10

Spróbuj tego:

template <class myType> 
vector<typename Foo<myType>::Bar*> Foo<myType>::bars; 
+0

beat mnie 4secs! ': + 1' ode mnie. – sbi

+0

Zawsze byłem pokonany przez dużą marżę. :( – Donotalo

+2

Yup, pokonaj mnie też. Zasada jest taka, użyj słowa kluczowego 'typename' przed A :: B, gdy ma to być typ i wyrażenie A wymaga parametru szablonu – aschepler

-1

vector<Foo::Bar*> Foo<myType>::bars; ... pamiętać, że Foo::

+0

-1? ... proszę, naucz mnie. – dgnorton

+0

@gngnon: Czy próbowałeś go skompilować? Błąd kończy się na 'gcc'. 'Foo' musi być kwalifikowany z parametrem typu między innymi. –

+0

@Richard, na VS 2008 tak (brak ostrzeżeń) ... na mojej drodze do kompilacji na gcc – dgnorton