2014-02-18 83 views
2

我有,我想在一些額外的功能來包裝一個向量:獲取類型名牛逼

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

    public: 
    virtual void read(); 

現在,我將如何去了解它是否必須在定義閱讀()類的外部知道typename 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(點的實例)知道,所以您應該將其寫入標題(和提防類型名關鍵字,它是在這種情況下需要):

#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>;