当我需要专门化我在模板类中声明的typename时,我必须使用哪些参数?

时间:2009-01-26 15:42:09

标签: c++ templates

我有一个用于线程安全向量的模板类:

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

我需要声明检索值的类型。编译器说模板的论据太少了。

2 个答案:

答案 0 :(得分:1)

您必须为SharedVector模板提供类型参数:

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

由于Connection*类型不是TCPClientManager中的模板参数,而是明确选择的类型,因此您无需在typename之前放置SharedVector<Connection*>::SizeType

答案 1 :(得分:0)

(除了litb,真的)

你应该输入你的容器;即typedef SharedVector<Connection*> ConnectionPool;。这样您就可以编写ConnectionPool::size_type

注意:container :: size()应返回container::size_type,而不是container::SizeType。这使得容器STL兼容。出于同样的原因,迭代器类应为container::iterator,添加元素由container::push_back(container::value_type const&)等完成。