47

std::exceptionから派生してオーバーライドするカスタム例外を作成しようとしていますwhat()。最初に、次のように書きました。

class UserException : public std::exception
{
private:
    const std::string message;
public:
    UserException(const std::string &message)
        : message(message)
    {}

    virtual const char* what() const override
    {
        return message.c_str();
    }
};

これは VS2012 では正常に動作しますが、GCC 4.8 では-std=c++11次のようにコンパイルされません。

エラー: 'virtual const char* UserException::what() const' の緩いスロー指定子</p>

だから私は追加しnoexceptます:

virtual const char* what() const noexcept override

これは GCC では正常に動作しますが、Visual Studio ではコンパイルされません (VS 2012 は をサポートしていないためnoexcept)。

エラー C3646: 'noexcept': オーバーライド指定子が不明です

これに対処するための推奨される方法は何ですか? 同じコードを両方のコンパイラでコンパイルしたいのですが、C++11 機能を使用しているため、異なる .xml でコンパイルすることはできません-std

4

11 に答える 11

45

マクロを使用する

#ifndef _MSC_VER
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif

そして、関数を次のように定義します

virtual const char* what() const NOEXCEPT override

noexceptの値をチェックすることで、VS の新しいバージョンで許可するように変更することもでき_MSC_VERます。VS2012 の場合、値は 1600 です。

于 2013-08-22T18:05:39.903 に答える
16

「noexcept」は、Visual Studio 2015 以降でのみサポートされています (ここに記載されているとおり: https://msdn.microsoft.com/en-us/library/wfa0edys.aspx )。Visual Studio 2013 で次のコードを使用しました (上記の例から派生):

#if !defined(HAS_NOEXCEPT)
#if defined(__clang__)
#if __has_feature(cxx_noexcept)
#define HAS_NOEXCEPT
#endif
#else
#if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 || \
    defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026
#define HAS_NOEXCEPT
#endif
#endif

#ifdef HAS_NOEXCEPT
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif
于 2015-10-23T09:12:15.410 に答える
3

noexceptは、MSVC の対処が最も簡単な「欠如」の 1 つです。MSVC2013 では yvals.h で定義されているマクロを使用するだけです_NOEXCEPT

于 2014-04-09T10:05:11.670 に答える
1

古いものthrow()(C++11 では非推奨) は両方のコンパイラで動作するようです。そこで、コードを次のように変更しました。

virtual const char* what() const throw() override
于 2013-08-22T18:06:02.967 に答える
0

#IF少しハックであっても、動作する可能性があります。

これを行うことができます:

#if __GNUG__
virtual const char* what() const noexcept override
#else
virtual const char* what() const override
#endif
//method body
于 2013-08-22T18:05:52.977 に答える