2
int main() {

 class A {
    public:
    static double test_code(const A& a);
  };

   class B : public A {
   public:
   B(int i) { };
   static double test_code2(const B& b);
   };

A::test_code(2);
B::test_code2(2);

return 0;

}

参照: http://ideone.com/ilfE8

最初のメソッド呼び出しはコンパイルされませんが、2 番目はコンパイルされます。この変換を機能させる方法はありますか? ありがとう

4

2 に答える 2

2

いいえ、暗黙の型変換では実行できません。それには複数の理由がありますが、より単純なのは、それがオプションであるためには、コンパイラが呼び出しの場所で拡張する可能性のあるすべての型について知ってからA、それらのいずれか/すべてが暗黙的に変換できるかどうかを確認する必要があるということですint。潜在的なあいまいさを解決します...特定のタイプから拡張されるすべてのタイプは、現在の変換ユニットが構築された後に拡張できるオープンセットであることに注意してください。

intたとえば、オブジェクトを受け取って返す関数を作成Aしたり、を明示的に作成したりするなど、さまざまな方法で同様のことを実現できますB。しかし、それらのどれも暗黙の変換を許可していません(つまり、変換のパスを明示的に要求するようにコードを変更する必要はありません)。

于 2012-09-28T16:17:02.143 に答える
1

これはうまくコンパイルされます、

int main()
{
    class A {
    public:
        A(int i)
        {}
        static double test_code(const A& a) { return 0.0; }
    };

    class B : public A {
    public:
        B(int i)
            : A(i) {}
        static double test_code2(const B& b) { return 0.0; }
    };

    A::test_code(2);
    B::test_code2(2);

    return 0;
}
于 2012-09-28T16:09:42.170 に答える