2009-01-26 9 views
0

J'ai une classe de modèle pour vecteur thread-safe:Lorsque j'ai besoin de spécialiser le nom de type que j'ai déclaré dans ma classe de template, quels arguments dois-je utiliser?

template <class T> 
class SharedVector { 
    std::vector<T> vect; 
    CRITICAL_SECTION cs; 
    SharedVector(const SharedVector<T>& rhs) {} 
public: 
    typedef typename std::vector<T>::size_type SizeType; 
    SharedVector(); 
    void PushBack(const T& value); 
    void PopBack(); 
    SizeType size(); 
    const T& operator[](int index); 
    void erase(int index); 
    void Lock(); 
    void Unlock(); 
    virtual ~SharedVector(); 
}; 

Ensuite, je veux l'utiliser dans mon gestionnaire de client pour le serveur TCP de déléguer certaines responsabilités de gestionnaire de clientèle à ce vecteur:

class TCPClientManager { 
    TCPClientManager(const TCPClientManager&) {} 
    TCPClientManager& operator=(const TCPClientManager&) {} 
    SharedVector<Connection*> connections; 
public: 
    TCPClientManager(); 
    SharedVector<>::SizeType size(); //here is the problem 
    void addConnection(const Client&); 
    void breakConnection(int); 
    void deleteConnection(int); 
    void Lock(); 
    void Unlock(); 
    ~TCPClientManager(); 
}; 

typename SharedVector<>::SizeType TCPClientManager::size() { 
    return connections.size(); 
} 

Je dois déclarer le type de valeur de récupération. Le compilateur a dit qu'il y avait trop peu d'arguments pour le modèle.

Répondre

1

Vous devez fournir un argument de type pour le modèle de SharedVector:

SharedVector<Connection*>::SizeType size(); 
.... 
SharedVector<Connection*>::SizeType TCPClientManager::size() { 
    return connections.size(); 
} 

Parce que ce type Connection* est pas un paramètre de modèle dans TCPClientManager, mais un type choisi explicite, vous n'avez pas besoin de mettre typename avant SharedVector<Connection*>::SizeType

0

(En plus de litb, vraiment)

Vous devriez typedef votre conteneur; c'est-à-dire typedef SharedVector<Connection*> ConnectionPool;. Cela vous permettrait d'écrire ConnectionPool::size_type.

Remarque: container :: size() doit renvoyer un container::size_type, pas container::SizeType. Cela rend le conteneur compatible STL. Pour la même raison, la classe d'itérateur doit être container::iterator, l'ajout d'éléments est effectué par container::push_back(container::value_type const&), etc.