【问题标题】:How to abbreviate class name inside its own definition?如何在自己的定义中缩写类名?
【发布时间】:2018-01-04 12:02:24
【问题描述】:

如何在此类的定义中为冗长的类名创建别名?我不希望它在类定义之外可以访问。我无法让它与typedefusing 一起使用。

就我而言,这是一个类模板。

template<typename T>
class detailed_class_name{

typedef detailed_class_name<T> foo; // either one 
using foo = detailed_class_name<T>; // of these 

public:
    foo(); // Error: ISO C++ forbids declaration of 'foo' with no type. 
};

有什么想法吗?

【问题讨论】:

  • foo();应该是构造函数的声明吧?你不能。
  • 你不能重命名构造函数或析构函数。如果这个类的名字让你感到困扰,也许它应该重命名?
  • 类名被选择为描述性的,这使得它在这种情况下很长(一种具有非常特殊功能的链表)。我只是希望类声明尽可能简洁明了,没有长的类名。我认为确定类是关于什么的注释可以让我在其声明的其余部分缩写它的名称。我怀疑使用ll 而不是linked_list_with_special_invariances_for_a_number_of_special_cases 会受到使用它的其他人的赞赏。

标签: c++ class typedef using


【解决方案1】:

你不能。构造函数的id-expression,即类定义中构造函数的名称是根据[class.ctor]p1(强调我的):

  • 在属于类的成员规范但不是友元声明的成员声明中,id-expression 是立即封闭类的注入类名;

什么是注入类名?根据[class]p2

class-name 被插入到在看到 class-name 之后立即声明它的范围内。 类名也被插入到类本身的范围内;这被称为注入类名。 [...]

所以注入的类名是类本身的名称,不能是别名。

[class.ctor]p1 中的这句话进一步强化了这一点:

class-name 不能是 typedef-name

如果您甚至不想编写构造函数,请考虑重命名该类,因为名称过于复杂。

【讨论】:

  • 我无法得到更清晰的答案。谢谢你,先生。
  • @Jersey 我的意思是,如果它真的那么糟糕,你也可以使用宏,但我真的不推荐那个
猜你喜欢
  • 2011-12-13
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2016-05-16
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多