我有一个用于线程安全向量的模板类:
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();
}
我需要声明检索值的类型。编译器说模板的论据太少了。
答案 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&)
等完成。