【问题标题】:c++ templates without "typename" or "class"没有“typename”或“class”的c ++模板
【发布时间】:2010-10-22 17:10:20
【问题描述】:

我习惯写这样的模板:

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

【问题讨论】:

  • 什么是U?它是int 等的typedef?
  • 我不知道——如果是的话,那有意义吗?我也不明白“U”是否被“int”取代
  • 在这种情况下,它可能是一个非类型参数(例如,实例化为someFunction&lt;10&gt;)。顺便说一句,问题不在于模板函数,而在于构造函数。
  • 您的代码显然是从内存中键入的,因为它有语法错误(没有函数返回类型)。请复制并粘贴 准确代码,以便我们给出明确的答案,否则每个人都只是猜测。

标签: c++ templates typename


【解决方案1】:

那个代码是错误的(错字)。在这种情况下必须有typenameclass


但是,这并不意味着所有模板参数都必须以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。

【讨论】:

  • 我明白了——谢谢!但是使用没有 typename 的模板到底有什么意义呢?
  • @Mat:如果真的使用了n,我们可以进行编译时计算。在不太有利的设置中,我们可以使用整数,例如数组大小template&lt;class T, int n&gt; struct Foo { T foo[n]; ... };
【解决方案2】:

我认为这只是要求忘记添加“typename”或“class”的人的错误。答案只是复制/粘贴代码,也很糟糕。

【讨论】:

    【解决方案3】:

    我确定 U 是一个宏。 我认为单纯的 typedef 不能代替 U,因为编译器必须在括号中看到两个关键字 'class' 或 'typename' 中的任何一个才能编译模板。

    把“U”放在那里的人有点太聪明了。因此你的困惑。

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

    【讨论】:

    • 这个理论如何解释 U 的第二次使用是如何工作的? :)
    【解决方案4】:

    如果 U 是一个类型而不是 template specialization

    【讨论】:

    • 很抱歉,但我不这么认为。如果替换模板中的参数,它应该是template &lt;&gt;,然后实际使用的类型在方法/函数的签名中。
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 2019-07-30
    • 2011-01-02
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多