不同类型的 C++ 模板错误

C++ Template Errors with different types

提问人: 提问时间:4/26/2013 更新时间:4/26/2013 访问量:94

问:

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

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. typename A 和 B 可能具有不同的类型,这些类型会出错,更糟糕的是,函数中未定义运算符<。

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

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

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

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

谢谢

C++ 模板 内存管理 转换 三法则

评论

0赞 Captain Obvlious 4/26/2013
根据类型,从“A”或“B”到“C”的投射并不能保证有效。如果类型不兼容,“A”和“B”将需要转换构造函数才能正常工作。
0赞 chris 4/26/2013
老实说,我看到的最糟糕的事情可能是 C 风格的演员阵容,至少取决于你打算如何工作。
0赞 statueuphemism 4/26/2013
A 和 B 可能没有定义复制构造函数,因此您可以根据 if 语句的结果返回 a 或 b 的浅层副本(似乎返回的引用可能是有意的)。如果 A 类和 B 类具有需要深度复制构造函数的成员,则这可能是一个错误。此外,可能无法访问 A 和 B 的必要构造函数来制作对象的副本(编译时错误)。话又说回来,谁知道“myfunction”应该做什么,所以我想说一个非描述性的名称也容易被滥用。

答:

1赞 The Floating Brain 4/26/2013 #1

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