当显式转换是必要的并且隐式不起作用时

时间:2016-02-20 18:15:51

标签: c++

当我有2个类实现了转换构造函数和转换运算符时,可能会出现需要显式转换的情况,因为隐式不起作用? (我用2类作为示例,看看继承是否有任何区别)

3 个答案:

答案 0 :(得分:2)

当隐式应用多个转换时,可能需要进行显式转换以解决歧义:

#include <iostream>
using namespace std;

void f(double x) {
    cout << "Double\n";
}

void f(int x) {
    cout << "Integer\n";
}

struct C
{
    C(float x) { this->x = x; }
    operator int() { return (int)x; }
    operator double() { return (double)x; }
    float x;
};

int main(int argc, char* argv[]) 
{
    C c(1);
    f(c); // error C2668: 'f' : ambiguous call to overloaded function
    f(static_cast<double>(c)); // calls f(double)
    f(static_cast<int>(c)); // calls f(int)
}

答案 1 :(得分:1)

只要你有相关的构造函数

class A
{
  // ...
  A(const B& b);  // or similar
};

类型

的隐式转换
B b(...);  // B is the other class
A a = b;

B b(...);
A a(b);

会奏效。

答案 2 :(得分:1)

以下是继承的示例,其中显式类型转换是必需的:

// Base class.
class Foo
{
};

// Derived class.
class Bar : public Foo
{
public:
    void SomeMethod()
    {
        cout << "I a in Bar!" << endl;      
    }
};

// Global method; input argument is derived class pointer.
void method(Bar* obj)
{
    obj->SomeMethod();
}

// main
int main()
{
    Foo* obj1 = new Foo();

    method(obj1); // This line will error when passing the base class object
                  // error C2664: 'method' : 
                  //cannot convert parameter 1 from 'Foo *' to 'Bar *'


    return 0;
}

所以在这里你需要显式地将强制转换为派生类。

method((Bar*) obj1);

希望这有帮助。