【问题标题】:C++ Template Errors with different types不同类型的 C++ 模板错误
【发布时间】:2013-04-20 01:50:23
【问题描述】:

我需要从以下内容中找出所有可能的错误,至少三个错误。

template<typename A, typename B, typename C>
C myfunction(const A& a, const B& b)
{ 
   if ( a < b )  return (C) a;
   else return (C) b;
}

我的回答是

  1. 类型名 A 和 B 可能有不同的类型,会出错,更糟糕的是,函数中没有定义运算符

  2. typename C 可以不同于 A 和 B,然后对定义为 const 的 a、b 对象进行更改

  3. typename A 可以是整数类型,但我们不对整数类型使用常量引用,我们只将它用于对象。

我的第三个答案是错误的......

谁能解释为什么我的答案是错误的,以及这个模板可能出现的所有错误?我得到了前两个答案的功劳,但我真的不喜欢它们。有人对此有更好的解决方案吗?

谢谢,

【问题讨论】:

  • 根据类型,不能保证从“A”或“B”转换为“C”。如果类型不兼容,“A”和“B”将需要转换构造函数才能正常工作。
  • 老实说,我看到的最糟糕的可能是 C 风格的演员表,至少取决于您打算如何工作。
  • A 和 B 可能没有定义复制构造函数,因此您可能只是返回 a 或 b 的浅表副本,具体取决于 if 语句的结果(似乎返回的引用可能是故意的)。如果 A 和 B 类具有需要深拷贝构造函数的成员,这可能是一个错误。此外,可能根本无法访问 A 和 B 的必要构造函数来复制对象(编译时错误)。再说一次,谁知道“myfunction”应该从什么开始,所以我想说一个非描述性的名称也容易滥用该函数。

标签: c++ templates memory-management casting rule-of-three


【解决方案1】:

从 A 到 C 或 B 到 C 的转换要么需要是多态的,要么是兼容的类型。您可以将 const 与整数引用一起使用。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 2019-06-09
    • 1970-01-01
    • 2018-05-01
    • 2015-08-05
    • 2012-10-04
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多