在C++中定义函数模板或类模板时,可以这样写:
template <class T> ...
Run Code Online (Sandbox Code Playgroud)
或者可以这样写:
template <typename T> ...
Run Code Online (Sandbox Code Playgroud)
是否有充分理由偏好一个而不是另一个?
我接受了最受欢迎(也很有趣)的答案,但真正的答案似乎是"不,没有理由偏爱另一个."
typename.class.但是,请注意,在模板模板参数的情况下,需要使用class而不是typename.请参阅下面的user1428839的答案.(但这个特殊情况不是偏好问题,而是语言的要求.)(这也会改变typename)
its*_*att 393
Stan Lippman 在这里谈到了这一点.我觉得这很有趣.
简介:Stroustrup最初用于class指定模板中的类型以避免引入新关键字.委员会中的一些人担心这种关键字的超载导致了混乱.后来,委员会引入了一个新的关键字typename来解决语法歧义,并决定让它也用于指定模板类型以减少混淆,但为了向后兼容,class保持其重载意义.
Dar*_*enW 303
根据Scott Myers的说法,Effective C++(第3版)第42项(当然,这必须是最终答案) - 差异是"没有".
建议是使用"class"如果预期T将永远是一个类,如果可能需要其他类型(int,char*,则为"typename").考虑一下使用提示.
Jor*_*eit 146
作为除了所有上述职位,使用的class关键字是被迫(直至并包括C++ 14),当处理模板的模板的参数,例如:
template <template <typename, typename> class Container, typename Type>
class MyContainer: public Container<Type, std::allocator<Type>>
{ /*...*/ };
Run Code Online (Sandbox Code Playgroud)
在这个例子中,typename Container会产生编译器错误,如下所示:
error: expected 'class' before 'Container'
Run Code Online (Sandbox Code Playgroud)
Mic*_*urr 47
我更喜欢使用typename,因为我不喜欢重载关键字(jeez - static对于各种不同的上下文有多少不同的含义?).
Meh*_*dad 15
class到typename.typename对于模板模板参数是非法的,因此为了保持一致,您应该使用class:
template<template<class> typename MyTemplate, class Bar> class Foo { }; // :(
template<template<class> class MyTemplate, class Bar> class Foo { }; // :)
Run Code Online (Sandbox Code Playgroud)
在回答Mike B时,我更喜欢使用'class',因为在模板中,'typename'具有重载含义,但'class'没有.以此检查整数类型为例:
template <class IntegerType>
class smart_integer {
public:
typedef integer_traits<Integer> traits;
IntegerType operator+=(IntegerType value){
typedef typename traits::larger_integer_t larger_t;
larger_t interm = larger_t(myValue) + larger_t(value);
if(interm > traits::max() || interm < traits::min())
throw overflow();
myValue = IntegerType(interm);
}
}
Run Code Online (Sandbox Code Playgroud)
larger_integer_t是一个从属名称,因此它需要'typename'在它之前,以便解析器可以识别这larger_integer_t是一个类型. 另一方面,阶级没有这样的超载意义.
那......或者我只是在懒惰.我输入'class'比'typename'更频繁,因此更容易输入.或者它可能是我写了太多OO代码的标志.
小智 9
只是纯粹的历史.来自Stan Lippman的报价:
这两个关键字的原因是历史性的.在原始模板规范中,Stroustrup重用现有的class关键字来指定类型参数,而不是引入可能会破坏现有程序的新关键字.这不是一个新的关键词没有被考虑 - 只是因为它可能被破坏而被认为是不必要的.直到ISO-C++标准,这是声明类型参数的唯一方法.
但是应该使用typename而不是class!有关详细信息,请参阅链接,但请考虑以下代码:
template <class T>
class Demonstration {
public:
void method() {
T::A *aObj; // oops ...
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
260288 次 |
| 最近记录: |