【发布时间】: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;
}
我的回答是
类型名 A 和 B 可能有不同的类型,会出错,更糟糕的是,函数中没有定义运算符
typename C 可以不同于 A 和 B,然后对定义为 const 的 a、b 对象进行更改
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