C++ 我应该在什么时候使用关键字";typename";使用模板时

C++ 我应该在什么时候使用关键字";typename";使用模板时,c++,templates,syntax,typename,C++,Templates,Syntax,Typename,我最近一直在做一个小项目,但我想不出什么 我得到了一个.h文件,其中包含一个类,使用一个typename模板。在那个班里有一个私人班 template <typename T> class Something { public: Something(); ~Something(); Node* Function1(int index); int Index(const T& id); private:

我最近一直在做一个小项目,但我想不出什么

我得到了一个.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


        };      
};
模板
分类
{
公众:
某物();
~Something();
节点*Function1(int索引);
内部索引(常数T&id);
私人:
类节点()
{
公众:
T-id;
//想象一下节点的其余部分
};      
};
当我想定义类“Something”的函数时,出现了这个问题

下面是我是如何做的(在一个.inl文件中)

模板
Node*Something::Function1(int-index)//返回类型写得好吗?
{
//返回指定索引处的节点
}
模板
int Something::Index(const T&id)//参数类型指定得好吗?
{
//返回具有指定id的节点的索引
}
所以窃听部分在定义部分。。。我是否必须告诉编译器返回类型(在本例中为节点*)使用typename模板(如:
typename节点*
)?那么参数呢<代码>类型名称常量节点&

那么基本上,什么时候我必须指定函数/参数是否使用模板

谢谢您的时间。

模板
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 Something::Node*Something::Function1(int-index)//返回类型写得好吗? { //返回指定索引处的节点 }
简单规则:如果
部分依赖于模板参数,则每次使用
Class::type
语法命名类型时,都需要使用
typename
关键字。(类的
Class
部分可能是模板参数,也可能是类模板中的
typedef
,等等。)

编辑:嵌套类作用域规则也有一些混淆。这主要与
typename
问题无关,因此这里是一个非模板示例

class Outer {
public:
  class Inner {
  };
  Inner* func(Inner* obj);
};

Outer::Inner* func(Inner* obj)
{
}
internal
的全名是
Outer::internal
。但是您也可以在类
Outer
范围内的任何位置使用较短的名称
internal
,包括
func
的所有声明。在
func
的定义中,返回类型不在
Outer
的范围内,因此必须输入全名。但是在
)之后,函数参数在
外部
的范围内,因此短名称是可以的


结合原始示例的模板性,由于
外部
的等价物是
某物
,因此对于
函数1
,您需要使用
typename
关键字来表示
某物::节点

,您需要告诉编译器节点是什么——在这种情况下,它是
某物内部的嵌套类型ng
。因为它依赖于
T
(它是一个依赖名称),所以需要告诉编译器它是一个类型,所以必须将它写为
typename Something::Node
。问题是可能存在一些
T
T
实际上不是类型(也就是说,如果您部分地专门化
某个东西


对于
索引
,您所拥有的很好--
常量T&
只是对
常量T
的引用,编译器知道
T
是什么。

类型名
在模板类型参数列表中是等效的:

template <class T> class C;

请在您的问题中发布sinppets!我已经发布了与代码段的链接。我不知道如何正确缩进我的代码段。好的,那么另一个方法的参数类型呢?
Node
是嵌套的类名。因此,您不能使用它,除非您在代码中使用的是
Something
方法,或者您使用的是完整的
typenamemething::Node
name。并且方法返回类型(在类外部定义)尚未“在”
Something
的一种方法,因此您必须向编译器说明。另一种方法不会有任何此类问题,因为编译器总是知道
int
的含义。感谢您的解释和花费的时间。因此函数索引定义中的参数类型应为typename const Class::Node&id?@Pacane:那要看情况,你想传递一个
T
还是一个
节点
?如果你想传递一个
节点
,完整版本可以工作,但不需要,因为编译器刚刚看到你在定义一个
方法,而
const Node&
就可以了。谢谢你的解释,也谢谢你花时间。编辑因此,如果参数是指向节点的指针,我必须再次指定typename部分,对吗?因为您在
Something
中,您可以只写
node*
。但是如果您明确地写出来,您需要说
typename Something::node*
,而不是只是
Something::Node*
。感谢您的解释和花费的时间。实际上,typename和class在参数列表中是不等价的。当需要模板参数时,typename关键字不能替换“class”。是的,谢谢,忘记了这一点。虽然这只是语言的一个boo boo,但他们只是忘记了ab在这种情况下,我和这里的我一样:)
template <class T> class C;
template <typename T> class C;
template <typename T> struct A {
    typedef typename T::some_type container;
};