我有一个矢量,我想包含一些额外的功能:
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
}
答案 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>;