2013-03-11 62 views
1

我已经学会了可以通过以下方式使用模板来创建数据结构:如何区分C++中的数据结构模板和函数模板?

template<typename T> 
struct X { 
    T weight; 
    int age; 
}; 

功能还可以使用以下方法模板:

template <class T> 
T func_name(int age, T human) { 
    something_here; 
} 

之一的差 - 是不是在第一种情况下,我们使用typename,而在第二种情况下,我们使用class

我发现,包含下面的代码:

template<typename S, typename T> 
bool is_null(const row<T>& r) 

所以,我无法理解的是,为什么我们结合使用typename(而不是class)与功能。我们不应该使用class

+0

您可能会发现与您相关的[此问题](http://stackoverflow.com/questions/213121/use-class-or-typename-for-template-parameters)。或者也许[这个问题](http://stackoverflow.com/questions/2023977/c-difference-of-keywords-typename-and-class-in-templates) – WhozCraig 2013-03-11 16:03:36

回答

3

在这种情况下,关键字typename和关键字class之间没有技术差异。这只是一个风格问题。前两个代码示例的含义如果以template<class T> struct Xtemplate <typename T> T func_name(int age, T human)开头,则不会更改一位。 (我倾向于使用class时,我的意思是暗示模板参数应该是一个类,而不是像int。)

+2

'typename'和'class'总是可以互换的或只是在这种情况下? – Roman 2013-03-11 16:02:01

+0

仅当声明模板参数时。 – aschepler 2013-03-11 16:02:59

+0

@Roman well'typename Foo {int x; };'是不一样的。 – djechlin 2013-03-11 16:03:38

0

template首次推出,它只允许现有的关键字class为指标,“这是一个模板参数“。由于当模板参数实际上不是类(函数指针,整数类型或某种其他“不是类”类型)时,这变得相当愚蠢,因此引入了typename以更清楚地表明template<typename T> struct something { T x; };允许something<int> a;以及something<name_of_class> a;

对于所有意图和目的,classtypename在模板参数的情况下是可以互换的,而且它只是一个风格问题,你选择做什么[大多数人可能更喜欢,如果你坚持的,而不是混合两个 - 或者,当类型HAS TO是类时可以使用class,当它可以是“任何”类型时使用typename]。

0

在模板参数定义的上下文中,关键字typenameclass是同义词。

几乎每个人都有一个惯例,他们倾向于坚持。我个人比较喜欢在这里总是使用class,并保留typename关键字用于其他用途。

typename的其他用途是消除模板定义或声明中的依赖类型的歧义。

这里是wikipedia一个例子:

template <typename T> 
void foo(const T& t) 
{ 
    // declares a pointer to an object of type T::bar 
    T::bar * p; 
} 

struct StructWithBarAsType { 
    typedef int bar; 
}; 

int main() { 
    StructWithBarAsType x; 
    foo(x); 
} 

如果你仔细观察,你会在该行T::bar * p;注意到,bar是依赖于一个模板参数T这是不明确的编译器为bar可以是类型或值取决于用于实例化模板的类型T的上下文。默认值是将bar作为一个值,所以其含义是将T::bar乘以p,这不是我们想要的。

解决方法是使用typename关键字来限定依赖类型。

typename T::bar * p; 

此提醒编译器,我们打算治疗bar作为一种事实。

0

只有一点不同(当声明模板参数时),也就是使用模板模板时。

以下是明确的C++

template <template <typename> class TT> struct example_one {}; 

虽然这不是:因为它似乎像你刚刚开始使用C++ /模板

template <template <typename> typename TT> struct example_two {}; 

,这个角落的情况下赢得了”关注你一段时间:-)除了上面的,类模板,函数模板,没关系:typename和class是同义词。