1

私は以下のようなクラスを持っています

#include <iostream>

#define Gb MemorySizeUnit.Gb
#define Mb MemorySizeUnit.Mb
#define Kb MemorySizeUnit.Kb

using namespace std;

enum MemorySizeUnit {Gb, Mb, Kb};

class Test
{
  private:
  MemorySizeUnit memSizeUnit;
  int memorySize;

  public:
  void setMemory(const int memSize, MemorySizeUnit unit);
 }

そして、私は次のようなことができるようになりたいです

Test test;
test.setMemory(20, Gb);// as opposed to test.setMemory(20, MemorySizeUnit.Gb)

コンパイラは #define でそれが好きではありません。"." があります。

4

2 に答える 2

5

マクロ展開にドットがあることに問題はありません。エラーは、マクロが列挙型の定義で展開されると、無効な列挙型定義になるという事実から発生します。

enum MemorySizeUnit {Gb, Mb, Kb};

次のように展開します。

enum MemorySizeUnit {MemorySizeUnit.Gb, MemorySizeUnit.Mb, MemorySizeUnit.Kb};

これはあなたが望むものではありません。

于 2012-08-05T17:08:55.943 に答える
2

完全に削除するだけ#defineで、列挙値は自動的に外側の名前空間に配置されます。using列挙型名の名前空間、 absnet a のような宣言を介して列挙型の値にアクセスする必要がある C# や Java とは異なります。

于 2012-08-05T17:09:01.023 に答える