Какие аргументы я должен использовать, когда мне нужно специализировать имя типа, которое я объявил в своем классе шаблонов? - PullRequest
0 голосов
/ 26 января 2009

У меня есть класс шаблона для поточно-ориентированного вектора:

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 ]

1 голос
/ 26 января 2009

Вы должны предоставить аргумент типа для шаблона SharedVector:

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

Поскольку этот тип Connection* не является параметром шаблона в TCPClientManager, а является явно выбранным типом, вам не нужно ставить typename перед SharedVector<Connection*>::SizeType

0 голосов
/ 27 января 2009

(в дополнение к литбу, действительно)

Вы должны напечатать свой контейнер; то есть typedef SharedVector<Connection*> ConnectionPool;. Это позволит вам написать ConnectionPool::size_type.

Примечание: container :: size () должен возвращать container::size_type, а не container::SizeType. Это делает контейнер STL-совместимым. По той же причине класс итератора должен быть container::iterator, добавление элементов выполняется container::push_back(container::value_type const&) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...