【问题标题】:using a typedef statement inside and outside of a class declaration block在类声明块内部和外部使用 typedef 语句
【发布时间】:2015-08-10 14:46:39
【问题描述】:

我正在设计一个类,它有一个由同一类对象的指针组成的向量对象。

例如:

#include <vector>
using namespace std;
class X
{
private:
   vector<X*> _neighbors;
};

我想使用typedef 语句来缩短我的工作,但我也想在类声明之外使用它,例如在另一个类中。我应该在哪里写typedef 声明?在类声明之前?之后呢?

【问题讨论】:

  • typedefwhat ?另外,请不要use namespace std;,尤其是在标题中。
  • @Quentin,typedef for vector&lt;*x&gt;,为什么我不应该使用using namespace std
  • 因为您将标准名称空间的整个喇叭内容转储到全局名称空间中,名称冲突等等。如果您在标题中执行此操作,您将在 用户的 代码上执行此操作。
  • 'using namespace std' in a header file 将其强制传递给包含您的标头的每个人。不强制它的原因是添加“std::”命名空间的确切原因——防止命名冲突。在您的实现文件(cpp/cxx/whatever)中随意使用您自己的约定。
  • @Quentin,好的,所以我不会使用它。这很奇怪/有趣,因为默认的 hello world 就像我一样使用它。我想我是从那里捡来的

标签: c++ class typedef


【解决方案1】:

您可以在定义类之前声明类:

#include <vector>

class X ;

typedef std::vector <X*> AX ;

class X {
    AX _neighbors ;
} ;

或者作为捷径(感谢@PaulRoub):

#include <vector>

typedef std::vector <class X *> AX ;

class X {
    AX _neighbors ;
} ;

【讨论】:

  • 既然只涉及一个指针引用,你就不能跳过class X前向声明,直接说typedef std::vector &lt;class X*&gt; AX ;吗?例如:ideone.com/3pwQzi
  • 如果可以的话也使用命名空间:)
  • @PaulRoub AFAIK 我不能这样做,因为编译器在声明 typedef std::vector &lt;X*&gt; AX ; 时不知道 X 是什么。它至少在 g++ 4.7.2 中失败:“'X' 未在此范围内声明”。
  • 使用 g++ 4.1.2 和链接示例对我来说工作正常。请注意,您在 typedef 中遗漏了 class 关键字。
  • @PaulRoub 你说得对,如果我添加 class 关键字就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多