编译器无法做隐式类型转换。
#include<iostream>#include<string>class Test{ public: operator const std::string() const{ return std::string("can you feel me ?"); }};class Foobar{ public: operator const int() const{ return 0; }};int main(){ Test t; //std::cout << t << std::endl; //error std::cout << static_cast<std::string>(t) << std::endl; Foobar f; std::cout << f << std::endl; //success}
#include<iostream>#include<string>class Test{ public: /* operator const std::string() const{ return std::string("can you feel me ?"); } */ operator const int() const{ return 10; }};class Foobar{ public: operator const int() const{ return 0; }};int main(){ Test t; std::cout << t << std::endl; //error std::cout << static_cast<int>(t) << std::endl; Foobar f; std::cout << f << std::endl; //successr return 0;}
[解决办法]
lz你好,我想原因应该是隐式转换不参与模板实参的推导。
Test-String(模板)->std::cout(模板)而这个对于c++是不允许的!
例如:
template <typename T>class A {};class StringValue {public: operator A<int>() const { return A<int>(); }};template <typename T>void f(A<T>) {}void f2(A<int>) {}int main(){ StringValue sv; f(sv); // ERROR f2(sv); // OK}
[解决办法]