2014-02-18 3 views
2

У меня есть вектор, который я хочу, чтобы обернуть в некоторой дополнительной функциональности:Получить TYPENAME T вне класса шаблона

template <typename T> 
class PersistentVector : PersistentObject 
{ 
    private: 
    std::vector<T> values; 

    public: 
    virtual void read(); 

Теперь, как бы я идти об определении чтения() вне класса, если он должен знаете имя типа T?

Первая попытка:

void PersistentVector::read() 
{ 
    // How can I get the iterator type? 
    typedef std::vector<T>::iterator it_type; // vector cannot be resolved 
} 

Вторая попытка:

// error: Member declaration not found 
template <typename T> 
void PersistentVector::read() 
{ 
    typedef std::vector<T>::iterator it_type; // no error 
} 
+0

Вы действительно должны получить сообщение об ошибке во второй попытке. Вам нужно «typename». Возможно, ваш компилятор не соответствует требованиям. – juanchopanza

+0

'typedef typename std :: vector :: iterator it_type;' - выглядит как @juanchopanza избили меня к нему :-) –

+0

Это шаблонная функция, которую вы хотите использовать, вам нужно либо переместить тело в заголовок, либо объявить типы, которые вы хотите явно использовать в файле cpp –

ответ

5

Ваша вторая попытка почти нет. У вас немного синтаксис, и у вас нет typename. Обратите внимание на PersistentVector<T>:::

template <typename T> 
void PersistentVector<T>::read() 
{ 
    typedef typename std::vector<T>::iterator it_type; // no error 
} 

Обратите внимание, что это определение должно быть доступным для любого кода, использующего его. Обычно это означает, что он должен находиться в файле заголовка или в файле, включенном заголовком.

В качестве альтернативы, вы можете поместить определение методы внутри определения класса:

public: 
    virtual void read() 
    { 
    typedef typename std::vector<T>::iterator it_type; 
    } 
+0

находится в файле .h или .cpp? Это другое –

+0

@DavidKernin Я добавил примечание. Это не должно быть в файле .cpp. – juanchopanza

+0

Хорошо, спасибо пользователю: D –

1

Это является обязательным, что тип шаблона известен в POI (пункт-конкретизации) перед соединением времени, так что вы должны либо положить, что в заголовок (и следить за TYPENAME ключевого слова, необходимо в этом случае):

#pragma once 

#include <vector> 

template <typename T> 
class PersistentVector 
{ 
    private: 
    std::vector<T> values; 

    public: 
    virtual void read() { 
     typedef typename std::vector<T>::iterator it_type; 
    } 
}; 

Или сделать что-то вроде явной конкретизации

.h файл

#pragma once 

#include <vector> 

template <typename T> 
class PersistentVector 
{ 
    private: 
    std::vector<T> values; 

    public: 
    virtual void read(); 
}; 

.cpp файл

#include "headerfile.h" 

template <typename T> 
void PersistentVector<T>::read() 
{ 
    typedef typename std::vector<T>::iterator it_type; 
} 

template class PersistentVector<int>; 
Смежные вопросы