1

ドット表記で静的関数を呼び出すときと同じように、このコードを機能させる方法はありますか?

struct A{
    static void f(){ }
    typedef int t;
};

template<typename T> void f(){}

int main(){
    A a;
    a.f();          //legit
    f<a.t>();       //‘a’ cannot appear in a constant-expression, ‘.’ cannot appear in a constant-expression
    a.t somevar;    //invalid use of ‘A::t’
    f<a::t>();      //‘a’ cannot appear in a constant-expression
    a::t somevar;   //‘a’ is not a class, namespace, or enumeration
}

編集:みんな、投稿する前に質問を読んでコードをテストしてください。ここでのポイントは、静的メソッドで実行できるように、を使用するのではなく、のインスタンスを介してA::t「呼び出す」ことです。tA

4

4 に答える 4

7

typedefはのようなものであり、のインスタンスであるため、A::t代わりにを使用する必要があります。a.tstaticaA


編集:私が上で言ったこととは対照的に、それは必ずしも「のようstatic」ではありません。静的メンバーの場合、次の特別なルールがあります。

クラスXの静的メンバーは、修飾ID式X::sを使用して参照できます。静的メンバーを参照するためにクラスメンバーアクセス構文(5.2.5)を使用する必要はありません。静的メンバーは、クラスメンバーアクセス構文を使用して参照できます。その場合、オブジェクト式が評価されます。[ 例:

struct process {
  static void reschedule();
};
process& g();

void f() {
  process::reschedule(); // OK: no object necessary
  g().reschedule();      // g() is called
}

atypedefは静的メンバーではないため、この構文は無効です。

aこの構文糖衣ではなくインスタンスを考えると、取得する唯一の方法tはそのタイプを取得することです。C ++ 11は、そのためのツールを提供します。

typedef decltype(a) a_type;
f<a_type::t>();
a_type::t somevar;

ただし、実際には使用されていません(おそらくマクロでは可能ですが、テンプレートの方が優れていることは誰もが知っています)。

于 2012-04-14T21:00:31.093 に答える
1

スコープ解決演算子を使用する必要があります(そしてからint値を返しますmain):

int main()
{
    A a;
    A::t somevar = 0;
    return 0;    
}

クラス外で使用する場合は、で導入されたタイプエイリアスをtypedef公開する必要があることに注意してください。あなたが持っていた場合:

class A
{
    static void f(){}
    typedef int t;
};

次に、上記の例のようにA :: tを使用すると、コンパイラエラーが発生します(「プライベートtypedefにアクセスできません...」)。publicアクセサ指定子を使用する必要があります。

class A
{
    static void f(){}
public:
    typedef int t;
};
于 2012-04-14T21:05:32.187 に答える
1

あなたはこのようにそれを行うことができます:

typedef decltype (a) AT;
typedef AT::t T;
f<T>();
T somevar;

decltypeはC++11に固有です

于 2012-04-14T21:20:40.640 に答える
0

スコープ解決演算子を使用する必要があるため、次のようにする必要があります。

f<A::t>();
A::t somevar;

スコープ解決演算子の詳細については、C++スコープ解決演算子::を参照してください。

于 2012-04-14T21:01:08.247 に答える