0

私の例外クラスには、複数の引数 (...) を持つコンストラクターがあります。これは Windows では正常に動作しますが、Linux では正常にコンパイルされますが、リンクを拒否します。

これが Linux で動作しないのはなぜですか?

以下に例を示します。

class gcException
{
public:
    gcException()
    {
        //code here
    }

    gcException(uint32 errId, const char* format = NULL, ...)
    {
        //code here
    }
}


enum
{
    ERR_BADCURLHANDLE,
};

.

編集

だから私はそれを次のように呼び出すと:

if(!m_pCurlHandle)
    throw gcException(ERR_BADCURLHANDLE);

次のコンパイル エラーが発生します。

error: no matching function for call to ‘gcException::gcException(gcException)’
candidates are: gcException::gcException(const gcException*)
                 gcException::gcException(gcException*)
                 gcException::gcException(gcException&)
4

3 に答える 3

6

問題は、コピー コンストラクターが、スローした一時的なものを受け入れないことです。これは一時的なものであり、したがって右辺値です。非 const への参照、つまりgcException&それにバインドできません。詳細はこちらをお読みください。

その回答に対するコメントが示唆するように、Microsoft コンパイラには、非 const オブジェクトを指す参照をバインドして右辺値を受け入れるバグがありました。コピー コンストラクターを次のように変更する必要があります。

gcException(gcException const& other) {
    // ...
}

それを機能させるために。バグは Visual C++ 2005 で修正されたと書かれているため、そのバージョン以降でも同じ問題が発生します。そのため、その問題をすぐに修正することをお勧めします。

于 2009-01-21T05:21:40.297 に答える
2

コンパイルとリンクは問題なく実行されます。テスト コードを完全な「プログラム」に拡張しました。

class gcException {
    public:
        gcException() { }
        gcException(int errId, const char* format, ...) { }
};
int main() { new gcException(1, "foo", "bar", "baz"); }

そして、g++ -Wall test.cppエラーなしで実行されました。によるとg++ -v、gcc バージョン 4.3.2 (Debian 4.3.2-1.1) を使用しています。私の簡単な例はあなたのためにコンパイルされますか?

(誤って g++ ではなく gcc を使用してコンパイル (またはリンク) しましたか?)

于 2009-01-21T05:20:02.903 に答える
0

ちょうどそれを理解したところ、コードブロックは g++ の代わりに gcc を使用してファイルをコンパイルしていたようです。

于 2009-01-21T05:35:10.080 に答える