首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用该类的实例引用类中的ty对联吗?

如何使用该类的实例引用类中的ty对联吗?
EN

Stack Overflow用户
提问于 2012-04-14 20:57:20
回答 4查看 5K关注 0票数 1

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

代码语言:javascript
复制
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,而是通过A实例“调用”t,就像使用静态方法一样。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-14 21:00:31

您必须使用A::t而不是a.t,因为typedef类似于staticaA的一个实例。

编辑:与我前面所说的不同,它并不总是“喜欢static”。对于静态成员,有以下特殊规则:

类X的静态成员可以使用限定id表达式X::s来引用;没有必要使用类成员访问语法(5.2.5)来引用静态成员。可以使用类成员访问语法引用静态成员,在这种情况下,对象表达式将被计算。[例子: 结构进程{静态空重排程();};进程& g();void (){进程:重新安排();// OK:不需要对象g().reschedule();// g()调用}

由于typedef不是静态成员,因此此语法无效。

给定实例a而不是这个语法糖,获得t的唯一方法就是获取它的类型。C++11为我们提供了一个这样的工具:

代码语言:javascript
复制
typedef decltype(a) a_type;
f<a_type::t>();
a_type::t somevar;

但是,我没有看到它的实际用途(好的,也许在宏中,但每个人都知道模板更好)。

票数 7
EN

Stack Overflow用户

发布于 2012-04-14 21:05:32

您需要使用范围解析操作符(并从main返回int值):

代码语言:javascript
复制
int main()
{
    A a;
    A::t somevar = 0;
    return 0;    
}

注意,如果您想在类之外使用别名,那么typedef引入的类型别名必须是公开可见的。如果你有:

代码语言:javascript
复制
class A
{
    static void f(){}
    typedef int t;
};

然后,在上面的示例中使用A::t like会产生编译器错误(“无法访问私有typedef.”)。您需要使用public访问器说明符:

代码语言:javascript
复制
class A
{
    static void f(){}
public:
    typedef int t;
};
票数 1
EN

Stack Overflow用户

发布于 2012-04-14 21:20:40

你可以这样做:

代码语言:javascript
复制
typedef decltype (a) AT;
typedef AT::t T;
f<T>();
T somevar;

C++11特有的解密类型

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10157296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档