2009-01-26 46 views
0

我對線程安全的矢量模板類:當我需要專門化我在模板類中聲明的typename時,我必須使用哪些參數?

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(); 
}; 

然後我想用它在我的客戶經理爲TCP服務器委派來自客戶經理的一些 責任這個載體:

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(); 
} 

我需要聲明檢索值的類型。編譯器說,它爲模板的參數太少。

回答

1

您必須提供的SharedVector模板類型參數:

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

因爲這Connection*類型不在TCPClientManager一個模板參數,而是一個明確的選擇類型,你不必把typenameSharedVector<Connection*>::SizeType

0

(除litb,真的)

你應該的typedef你的容器;即typedef SharedVector<Connection*> ConnectionPool;。這將允許你寫ConnectionPool::size_type

注意:container :: size()應返回container::size_type而不是container::SizeType。這使得容器STL兼容。出於同樣的原因,迭代器類應該是container::iterator,添加元素是由container::push_back(container::value_type const&)等完成的。

相關問題