簡體   English   中英

捕獲模板化異常時的編譯器錯誤

[英]Compiler error when catching templated exception

這是用通用C ++編寫的通用異常及其基類:

class DRAException : public std::exception {
public:
    DRAException( const std::string& what ) : std::exception( what.c_str() ) {}
    virtual ~DRAException( ){}
};

template<typename T>
class InvalidArgumentException : public DRAException{
    static std::string CreateErrorMessage( const std::string& argName, T value, boost::optional<T> min, boost::optional<T> max ){
        std::string& errorMessage = "Invalid argument value for " + argName + ": " + StringUtils::toString(value);
        if( min.is_initialized() )
            errorMessage += ". Min value: " + StringUtils::toString( min.get() );
        if( max.is_initialized() )
            errorMessage += ". Max value: " + StringUtils::toString( max.get() );
        return errorMessage;
    }
public:
    InvalidArgumentException( const std::string& argName, T value, boost::optional<T> min, boost::optional<T> max ) :
        DRAException( CreateErrorMessage(argName, value, min, max) ){ }
};

在C ++ / CLI程序集中,我定義了一個將本地異常映射到托管異常的宏:

#define BEGIN_EXCEPTION_GUARDED_BLOCK \
    try {
#define END_EXCEPTION_GUARDED_BLOCK \
    \
    //Other catch clauses omitted for brevity's sake
    } catch( DRAExceptions::InvalidArgumentException ex ) { \
        throw gcnew System::ArgumentException( msclr::interop::marshal_as<System::String^>( ex.what() ) ); \
    }

然后我像這樣使用它:

void MCImage::FindOptimalLut( Single% fWindow, Single% fLevel ) {
    BEGIN_EXCEPTION_GUARDED_BLOCK
    pin_ptr<Single> pWindow = &fWindow, pLevel = &fLevel;
    m_pNativeInstance->findOptimalLut( *pWindow, *pLevel );
    END_EXCEPTION_GUARDED_BLOCK
}

但是,當嘗試構建最后一段代碼時,出現此錯誤:

Image.cpp(72): error C2955: 'DRAExceptions::InvalidArgumentException' : use of class template requires template argument list
4>          d:\svn.dra.workingcopy\mcommon\../CommonCppLibrary/CustomExceptions.h(50) : see declaration of 'DRAExceptions::InvalidArgumentException'
4>Image.cpp(72): error C2316: 'DRAExceptions::InvalidArgumentException' : cannot be caught as the destructor and/or copy constructor are inaccessible

我不能在catch子句中專門化我的模板化類,因為那樣會破壞捕獲所有專門化類型(無論類型)的目的。 至於另一個錯誤,構造函數和析構函數都是公共的,所以我不明白。 我該如何解決?

PS:我剛剛開始使用Boost庫,因此可以使用Boost特定的解決方案

編譯器會准確告訴您問題所在:

使用類模板需要模板參數列表

您不能一次捕獲所有可能的異常。 您必須為每個不同的T擁有一個, 或者通過引用一個公共基類來捕獲。

catch (const DRAException& Ex)

您正在嘗試使用類型模板,就像它是一種類型一樣。 不是-只有模板的實例是類型。

您可以根據自己的情況輕松解決問題。 您的類根本不需要是模板,只需將其構造函數和CreateErrorMessage幫助器函數作為模板即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM