0

さて、Visual Studios C++ (C++/CLI) の前方宣言で問題が発生しています。コードは次のとおりです。

ああ

#include "B.h"

#ifdef B_H
#pragma once

public ref class A : public base_class  //base_class is public, memory managed 
{
    B^ b;
}

#endif

Bh

#define B_H

#pragma once

ref class A;

ref class B 
{
    A^ a;
}

#include "A.h"

#ifdef/#pragma ガードは、*.h が 2 回読み取られるのを防ぎ、bh が最初に読み取られるようにする必要があります。コンパイラの出力から、そうであると確信しています。(#pragma once と #include 配置で #ifdef/#define が必要かどうかさえわかりません)

しかし、コンパイラはpath/ah: error C2011: 'class' type redefinition を訴えます。ファイル パス/Bh を参照

A は実際のクラス定義の派生クラスであるため、前方宣言で何かを行う必要がありますか、それとも間違ったツリーを吠えていますか?

4

1 に答える 1

3

必要な2つの変更:

  1. クラス定義の閉じ中括弧の後にセミコロンを追加します。
  2. Ahで#pragma once、をファイルの最初の行に移動します。これを#ifdefブロックの中に入れると、めちゃくちゃになります。

また、これを行う簡単な方法は、どちらのヘッダーファイルにももう一方のヘッダーファイルを含めず、両方のファイルで前方宣言を使用することです。

ああ:

#pragma once
ref class B;
public ref class A : public base_class  //base_class is public, memory managed 
{
    B^ b;
};

Bh

#pragma once
ref class A;
ref class B 
{
    A^ a;
};
于 2012-06-01T18:32:54.203 に答える