3

興味深い(またはばかげた)インタビューの質問がありました。以下のコードがコンパイルされないことはわかっていますが、クラス C を変更してコードをコンパイルする方法については答えられませんでした。Test(C(1));またはのような答えvoid Test(C c)は受け入れられないと言われました。手伝って頂けますか?

質問は次のとおりです。

Q11. 次のコードはコンパイルされますか? そうでない場合は、コードをコンパイルするために、必要な変更をクラス C のみに加えてください。

class C
{
public:
    C(int i) {}
    ~C() {}
};

void Test(C &c)
{
}

int main(int, char*)
{
    Test(1);
    return 0;
}
4

3 に答える 3

7

コードはコンパイルされません。

C署名が間違っているため、最初にクラスのみを変更してコンパイルする方法はありませmainん (char* は決して2 番目の引数の型ではありません)。

しかし、 の署名mainが正しかったとしてもTest(1);、 の一時オブジェクトを暗黙的に作成し、Cそれを に渡したいと考えていTestます。ただし、一時を非 const 参照にバインドすることはできません。クラスのみを変更Cして、パラメーターにバインドできる暗黙的な一時を作成する方法がわかりませんTest

編集:私が来た最も近いのは、に入れfriend void Test(int i) { }ていCます。これは Sun の CC コンパイラでコンパイルできますが、ideone の g++ 4.4、4.5、または 4.8 ではコンパイルできません。EDIT2: 11.4/5 から、ここで g++ が正しいようです: 関数は、囲んでいるスコープではなく、クラスのスコープに導入されます。

于 2013-09-03T15:00:27.757 に答える
1

http://ideone.com/pnZwh6についてはどうですか 。これはハックですが、コードをコンパイルできます。

class C
{
public:
    C(int i) {}
    ~C() {}

#define C const C
};

void Test(C &c)
{
}

int main(int, char**)
{
    Test(1);
    return 0;
}
于 2013-09-03T16:47:52.140 に答える