0

組み込み型をC++ 名前空間で使用できるようintにすることはできますか?double

#include <complex>

typedef int my_int;

namespace my_namespace {
  namespace std = ::std;  // Works
  using ::my_int;         // Works

  using ::int;            // Fails: "expected unqualified-id before 'int'"
  typedef ::int int;      // Fails: "expected unqualified-id before 'int'"
}

typedef int out::int;     // Fails: "expected unqualified-id before 'int'"

my_namespace::my_int x;            // Works
my_namespace::std::complex<int> c; // Works

// I would like to use this:
my_namespace::int x2;    // Fails: "expected unqualified-id before 'int'" 

これは、キーワードを含む修飾識別子の使用を禁止する言語の制限によるものだと思われますが (intこの場合)、これらを公開する何らかの方法があることを望んでいます。

使用事例

外部ツール ( SWIG ) が別の言語で関数を適切にラップできるように、名前空間を使用して型を整理しようとしています。例えば:

void one_two(int &x, int &y) { x = 1; y = 2; }

ターゲット言語では、これは引数を変更するone_two(x, y)関数、または出力を返す関数としてラップできますx, y = one_two()SWIGに意図した使用法を提供するために、引数に「注釈を付ける」何らかの方法が必要です。現在のSWIG実装で最もクリーンなオプションは、名前空間を使用して 2 つの用途を区別することです: したがって、出力バージョンは次のx, y = one_two()ように表すことができます::

void one_two(out::int &x, out::int &y) { x = 1; y = 2; }

out::intどういうわけか同義語を作ることができればint。(このアプローチは、ユーザー定義型でうまく機能します。)

4

1 に答える 1

5

intそして友達は言語のキーワードです。それらはグローバル名前空間の名前ではありません。言語に関する限り、それらは名前ではありません。で修飾すると::エラーになります。変数に名前を付けようとしてintもエラーになります。具体的には、C++03 では 2.1 パラグラフ 1 を、C++11 では 2.12 パラグラフ 1 を参照してください (テキストは同じです)。

The identifiers shown in Table 3 are reserved for use as keywords (that is, they
are unconditionally treated as keywords in phase 7):
[ ... ]
int
于 2012-07-28T04:26:30.933 に答える