2017-11-13 6 views
0

このコードでC++のtryを使用してインストラクターの定義におけるC2509: - 定義の中でキャッチ

A::A() 
try: B() 
{} 
catch(Exception e) {} 

、私はC2509エラーがあります。 ヘッダーファイルの定義(F12)または定義の(Ctrl + F12)に移動しようとすると機能しません。

私は

A::A() 
{ 
try 
{ B();} 
catch(Exception e) {} 
} 

を試みたが、クラスBに純粋仮想関数があるので、これは不可能です。

私はAが明示的抽象をinitaliseことができ、その場合1)はB.から派生を想定し、今

try: {} 
catch 

try{} 
catch 
+0

エラー名もショートカットも、C++では普遍的ではありません。 – user463035818

+0

私はあなたの質問に答えてくれたと思います。「クラスBには純粋な仮想関数があるので、これは不可能です。 イニシャライザリストを含む抽象クラスをインスタンス化することはできません。 – virgesmith

+0

@virgesmithあなたの答えをありがとう、なぜ私はtry {}ではなく、try:の後に抽象クラスを初期化できますか? –

答えて

0

との差に困惑しています2)Aを初期化するには、の前に完全に構​​築されている必要があります。 A :: A()の本体が実行されている必要があります。

これが私の作品:G ++ 5.4を使用して

#include <stdexcept> 

struct B 
{ 
    B() { } 
    virtual int f() = 0; 
}; 

struct A : B 
{ 
    A() try : B() { } catch(const std::exception&) { } 

    int f() { return 0; } 
}; 

int main() 
{ 
    A a; 
} 

。私は(あなたが提供していない)あなたのエラーを推測しています。 BからAを導出しないか、または2つのクラスの仮想関数定義の間に不一致があるかどうかを判定します。

+0

ありがとうございました。あなたが仮定したように、AはBから派生しています。私はすべての仮想関数を初期化していないことを理解しました。それは多くの助けとなりました。 ;) –

関連する問題