有没有办法让这段代码工作,就像用点符号调用静态函数时一样?
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,就像使用静态方法一样。
发布于 2012-04-14 21:00:31
您必须使用A::t而不是a.t,因为typedef类似于static,a是A的一个实例。
编辑:与我前面所说的不同,它并不总是“喜欢static”。对于静态成员,有以下特殊规则:
类X的静态成员可以使用限定id表达式X::s来引用;没有必要使用类成员访问语法(5.2.5)来引用静态成员。可以使用类成员访问语法引用静态成员,在这种情况下,对象表达式将被计算。[例子: 结构进程{静态空重排程();};进程& g();void (){进程:重新安排();// OK:不需要对象g().reschedule();// g()调用}
由于typedef不是静态成员,因此此语法无效。
给定实例a而不是这个语法糖,获得t的唯一方法就是获取它的类型。C++11为我们提供了一个这样的工具:
typedef decltype(a) a_type;
f<a_type::t>();
a_type::t somevar;但是,我没有看到它的实际用途(好的,也许在宏中,但每个人都知道模板更好)。
发布于 2012-04-14 21:05:32
您需要使用范围解析操作符(并从main返回int值):
int main()
{
A a;
A::t somevar = 0;
return 0;
}注意,如果您想在类之外使用别名,那么typedef引入的类型别名必须是公开可见的。如果你有:
class A
{
static void f(){}
typedef int t;
};然后,在上面的示例中使用A::t like会产生编译器错误(“无法访问私有typedef.”)。您需要使用public访问器说明符:
class A
{
static void f(){}
public:
typedef int t;
};发布于 2012-04-14 21:20:40
你可以这样做:
typedef decltype (a) AT;
typedef AT::t T;
f<T>();
T somevar;C++11特有的解密类型
https://stackoverflow.com/questions/10157296
复制相似问题