我习惯写这样的模板:
template<typename T>
void someFunction(SomeClass<T> argument);
然而 - 现在我在另一个这样编写的线程中遇到了模板:
template<U>
void someFunction(SomeClass<U> argument);
据我所知,可以互换地使用“typename”和“class”(除了有关嵌套类型的一些细节......)。但如果我不在括号中放一个关键字,这意味着什么呢?
谢谢!
有问题的话题: Problems writing a copy constructor for a smart pointer
答案 0 :(得分:12)
该代码错误(错字)。在这种情况下,必须有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 :(得分:2)
我认为那个人忘记添加“typename”或“class”只是一个错误。答案只是复制/粘贴代码,这也很糟糕。
答案 2 :(得分:0)
我确定你是一个宏。 我不认为仅仅使用typedef代替U,因为编译器必须在括号中看到两个关键字“class”或“typename”中的任何一个才能编译模板。
任何把'U'放在那里的人对自己的好处都有点太聪明了。因此你的困惑。
欢迎来到维护其他人的脏代码的世界。
答案 3 :(得分:0)
如果U是一个类型,那么template specialization