2011-12-22 57 views
3

我有一个类,我需要隐式转换为一些中间值,例如链接隐式转换运算符

struct outer { 
    struct inner { 
     operator T() { return T(); } 
    }; 
    operator inner() { return inner(); } 
}; 

如果我有这样的结构,是总是有效的事,例如

void f(T t); 
outer o; 
f(o); 
+2

什么是T?模板类型? –

+2

@MooingDuck:一种类型。 T是什么并不重要。这不是模板,因为我没有参数? – Puppy

+4

'f(o)'需要两次用户定义的转换,而标准允许最大std-conversion - > u-d conversion - > std-conversion。 –

回答

8

§13.3.3.1.2 [over.ics.user] p1

用户定义的转换序列由后跟一个第二标准的转换序列的初始标准转换序列,随后一个用户定义的转换(12.3)的。

注意单词“序列”的单数和缺失。在隐式转换序列中,永远只会考虑一个用户定义的转换。

+0

是否有相应的位表示仅会出现一个“用户定义的转换序列”? – ssube

+0

@peachykeen这是参数传递的定义。对于类类型,它涉及一个用户定义的转换序列(如果参数类型不同于参数类型),然后将临时结果“T”的最终副本转换为类型为“T”的参数。 –

0

这工作:

struct Foo {}; // renamed T in Foo to avoid confusion! 

struct outer { 
     struct inner { 
       operator Foo() { return Foo(); } 
     }; 

     operator inner() { return inner(); } 

     template <typename T> 
     operator T() { 
       return operator inner(); 
     } 
}; 

int main() { 
     void f(Foo t); 
     outer o; 
     f(o); 
} 

但仅仅因为f不超载,所以它不是一个真正的解决方案。

+0

如果这是可以接受的,我只需在外部类中创建'Foo'运算符。 – Puppy

+0

我并不感到惊讶,这不是“可以接受的”,但它是我得到的最好的“修复”。 – curiousguy