不使用"typename"或"class"的C++模板

4

我习惯这样写模板:

template<typename T>
void someFunction(SomeClass<T> argument);

然而,现在我在另一个帖子中遇到了这样的模板编写方式:
template<U>
void someFunction(SomeClass<U> argument);

据我所知,除了嵌套类型的一些细节之外,“typename”和“class”可以互换使用。但是,如果我根本不在括号中放置关键字,这意味着什么?
谢谢!
相关主题: 为智能指针编写复制构造函数时出现的问题

1
U是什么?它是int的typedef等吗? - kennytm
我不知道 - 如果是这样,那么它有意义吗?如果“U”被替换为“int”,我也不会理解。 - Mat
在这种情况下,它可能是一个非类型参数(例如实例化为someFunction<10>)。顺便说一句,这个问题不是关于模板函数,而是构造函数。 - UncleBens
你的代码显然是从记忆中输入的,因为它有语法错误(没有函数返回类型)。请复制并粘贴完全相同的代码,这样我们才能给出明确的答案,否则每个人都只是在猜测。 - Martin York
4个回答

14

那段代码有错误(错别字)。在这种情况下必须要有一个typename或者class


然而,并不是所有模板参数都必须以typename/class开始。这是因为除了类型外,模板参数还可以是整数常量,因此以下代码是有效的:

// template <int n>, but n is not used, so we can ignore the name.
template <int>
void foo(std::vector<int>* x) {
}

int main () {
  foo<4>(0);
}

以下内容也是如此:

typedef int U;

// template <U n>, but n is not used, so we can ignore the name.
template <U>
void foo(std::vector<U>* x) {
}

int main () {
  foo<4>(0);
}

这就是为什么我在评论中问 U 是否为一个typedef的原因。


1
我明白了,谢谢!但是如果不带typename使用模板的点在哪里? - Mat
2
@Mat:如果那个 n 真的被使用了,我们可以在编译时进行计算。在一个不太优越的设置中,我们可以将整数用于例如数组大小 template<class T, int n> struct Foo { T foo[n]; ... }; - kennytm
新手问题:在那段代码中我们不需要template。这是没有意义的,对吧?这只是为了解释还是我漏掉了什么? - starriet

2

我认为只是提问者忘记添加"typename"或"class",这只是一个错误。回答者只是复制粘贴了代码,这也很糟糕。


0

我相信U是一个宏。我认为仅使用typedef无法替代U,因为编译器必须在括号中看到'class'或'typename'这两个关键字之一才能编译模板。

把'U'放在那里的人聪明过头了,这就是你的困惑所在。

欢迎来到维护别人肮脏代码的世界。


这个理论如何解释 U 的第二次使用呢? :) - UncleBens

0
如果 U 是一种类型,那么这就是一个 模板特化

抱歉,我不这么认为。如果您在模板中替换参数,它应该读作“template <>”,然后实际使用的类型在方法/函数的签名中。 - Diego Sevilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接