什么时候应该使用模板
我一直在一个小项目,最近的工作时,我无法弄清楚的东西我使用关键字“类型名称” ..什么时候应该使用模板
我已经拥有一个.H文件包含一个类,使用一个typename模板。在那个班里面有一个私人班。
template <typename T>
class Something
{
public:
Something();
~Something();
Node* Function1(int index);
int Index(const T& id);
private:
class Node()
{
public:
T id;
//Imagine the rest for the Node
};
};
问题发生时,我想定义(在.INL文件)
template<typename T>
Node* Something::Function1(int index) //Is the return type well written?
{
// returns the node at the specified index
}
template<typename T>
int Something::Index(const T& id) //Is the parameter type well specified?
{
// returns the index of the node with the specified id
}
所以窃听类的“东西”
以下是我在做它的功能部分在定义部分...我是否必须告诉编译器返回类型(在这种情况下是Node *)使用typename模板(如下所示:typename Node*
)?那么参数呢? typename const Node&
?
所以基本上,我什么时候必须指定更多的功能/参数使用模板?
谢谢你的时间。
template<typename T>
typename Something<T>::Node * Something::Function1(int index) //Is the return type well written?
{
// returns the node at the specified index
}
简单的规则:你需要使用typename
关键字每次名称中使用Class::Type
语法类型,如果Class
部分取决于模板参数。 (Class
部分可能是模板参数,或者可能是您的班级模板中的typedef
等)
编辑:对于嵌套类作用域规则也存在一些困惑。这主要与typename
问题无关,所以这里是一个非模板示例。
class Outer {
public:
class Inner {
};
Inner* func(Inner* obj);
};
Outer::Inner* func(Inner* obj)
{
}
的Inner
全称是Outer::Inner
。但是,您也可以使用类别为Outer
的范围内的任何地方的简称Inner
,其中包括func
的所有声明。在func
的定义中,返回类型不在Outer
的范围内,所以全名是必需的。但在(
之后,功能参数ARE在Outer
的范围内,所以短名称没问题。
与原来的例子的模板岬结合这一点,因为Outer
相当于是Something<T>
,你需要的typename
关键字说Something<T>::Node
。
对于Function1
,您需要告诉编译器Node是什么 - 在这种情况下,它是Something<T>
中的嵌套类型。由于它取决于T
(它是一个独立的名称),因此您需要告诉编译器它是一种类型,所以您必须将其编写为typename Something<T>::Node
。问题是可能有一些T
其中Something<T>::Node
实际上不是一种类型(即,如果您部分专门Something<T>
)。
对于Index
,你有什么好 - const T&
只是对const T
的引用,编译器知道什么是T
。
typename
和class
在模板类型参数列表相当于:
template <class T> class C;
相同
template <typename T> class C;
如果要求typename
指的是dependent names时:
template <typename T> struct A {
typedef typename T::some_type container;
};
实际上,typename和class在参数列表中并不等价。当期望模板模板参数时,typename关键字不能替换'class'。 – 2010-11-19 18:03:27
是的,谢谢,忘了这个。尽管这只是语言方面的一个嘘声 - 他们只是忘记了这个情况,和我在这里一样:) – 2010-11-19 18:04:06
请将sinppets发布到您的问题中! – mmmmmmmm 2010-11-19 17:45:09
我已经发布了片段的链接。我无法弄清楚如何正确缩进我的片段。 – Pacane 2010-11-19 17:45:47