从模板类外部获取typename T.

时间:2014-02-18 21:40:01

标签: c++ c++11

我有一个矢量,我想包含一些额外的功能:

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

  public:
    virtual void read();

现在,如果必须知道类型名称T,我将如何在类外定义read()?

首先尝试:

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
}

2 个答案:

答案 0 :(得分: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;
  }

答案 1 :(得分: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>;