如何使用此类的实例引用类中的typedef?

Lor*_*one 1 c++ static typedef

有没有办法让这个代码工作,就像用点符号调用静态函数时一样?

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
}
Run Code Online (Sandbox Code Playgroud)

编辑:伙计们,请在发布之前阅读问题并测试您的代码.这里的要点是不使用A::t,但"援引" t通过一个实例A,就像你可以用静态方法做.

gli*_*tto 6

你必须使用A::t而不是a.t因为typedef是statica它的实例A.


编辑:与我上面所说的相反,它并不总是"喜欢static".对于静态成员,有以下特殊规则:

可以使用qualified-id表达式X :: s来引用类X的静态成员; 没有必要使用类成员访问语法(5.2.5)来引用静态成员.可以使用类成员访问语法来引用静态成员,在这种情况下,评估对象表达式.[例如:

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

void f() {
  process::reschedule(); // OK: no object necessary
  g().reschedule();      // g() is called
}
Run Code Online (Sandbox Code Playgroud)

因为typedef不是一个静态成员,这个语法是无效的.

鉴于实例a而不是这种语法糖,获得t它的唯一方法是获得它的类型.C++ 11为我们提供了一个工具:

typedef decltype(a) a_type;
f<a_type::t>();
a_type::t somevar;
Run Code Online (Sandbox Code Playgroud)

但是,我认为它没有实际用途(好吧,也许在宏中,但每个人都知道模板更好).

  • 有趣的是他从未说过"static typedef",但每个人都坚持说"嘿,静态typedef不存在". (3认同)