2013-08-07 76 views

回答

1

operator T()返回与x,y,z初始化为T列表。这意味着DoSomething的过载在需要2个向量或需要向量的过程和double*之间不明确。

因此,如果您在调用站点将您的第二个参数强制转换为您想要的类型,您将明确告诉编译器需要采取的重载。

std::enable_if基本上消除了使用三个double s不可构造的过载,这意味着它消除了模糊性,因此它编译。

你的载体可以与三个double s构造。

Vector(double x, double y, double z) 
+0

数组在哪里?难道它不直接选择一个转换吗''double *'(如果实例化会失败,但没有被实例化,因为重载解析早已出错)? – hvd

+1

数组?呵呵....? –

+0

你编辑了你的答案腐败,并把它放回去。你不应该把它放回:)只是尝试删除其他超载,并强制隐式转换为'double *':它不会工作。转换为'double *'是不可能的。有和没有'enable_if'之间唯一的区别是什么时候被检测到。 – hvd

1

没有enable_if,您的转换运算符对每种类型都存在。如果尝试实例化不能从{x, y, z}构造的类型的转换运算符,但不会改变运算符存在的事实,则会出现错误。因为它存在,所以该类型被认为可转换为double *,并且重载解析不能选择最佳匹配。

相关问题