如何在具有此类实例的类中引用 typedef
how to reference a typedef within a class with an instance of such class?
有没有办法让这段代码工作,就像用点符号调用静态函数一样?
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
,就像你可以使用静态方法一样。
你必须
使用A::t
而不是a.t
,因为typedef就像static
,而a
是A
的一个实例。
编辑:与我上面所说的相反,它并不总是"像static
"。 对于静态成员,有以下特殊规则:
类 X 的静态成员 s 可以使用限定 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 }
由于typedef
不是静态成员,因此此语法无效。
给定实例a
而不是这个语法糖,获取t
的唯一方法是获取它的类型。 C++11 为我们提供了一个工具:
typedef decltype(a) a_type;
f<a_type::t>();
a_type::t somevar;
但是,我认为它没有实际用途(好吧,也许在宏中,但每个人都知道模板更好)。
您需要使用范围解析运算符(并从 main
返回 int 值):
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;
};
你可以
这样做:
typedef decltype (a) AT;
typedef AT::t T;
f<T>();
T somevar;
decltype 特定于 C++11
您将需要使用范围解析运算符,因此可能需要
f<A::t>();
A::t somevar;
有关范围解析运算符的详细信息,请查看C++范围解析运算符::。
相关文章:
- 对显式实例化的模板函数的未定义引用
- 重载运算符*以获取对另一个类的实例的引用
- 为什么我不能引用指向实例化对象的函数的指针?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- 将元组和整型实例合并到引用元组中
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- 为什么不能在实例化对基类的引用的同时实例化指向派生类的指针?
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 超出返回引用的单一实例生存期
- 反向函数不反转类实例化的引用字符串
- 通过引用将私有类实例传递到另一个类 C++ 的"get"函数中
- 多个实例保存对unique_ptr的引用
- 类模板实例化和通用引用
- 对从静态实例引用的类模板的静态成员的未定义引用
- 如何正确格式化类实例引用
- 如何在类构造函数中存储实例引用