2012-12-12 77 views
1

我有一个类NormalCalculator。在NormalCalculator之内,我定义了一个structGLpoint在命名空间,类和范围

正如我的项目已取得进展,我发现用来在我的代码GLpoint其他地方,但我觉得很凌乱和屏幕污染不得不每次我想在其他地方使用GLpoint struct在我的解决方案,之外的时间写NormalCalculator::GLpointNormalCalculator班。

有没有什么办法可以让编译器知道GLpoint存在于NormalCalculator.h中,并且让它只是让我把它称为GLpoint?我很确定应该有办法。

我已经试过

using NormalCalculator 

using NormalCalculator::GLpoint 

不如预期,这些并没有为NormalCalculator工作是一类,而不是一个命名空间。

+3

尝试过typedef? – PlasmaHH

+0

如果您在命名空间中需要它,那么为什么不在类名称空间而不是类中声明呢? –

回答

3
typedef NormalCalculator::GLpoint GLpoint; 
4

您可以使用typedef。

namespace my_ns { 
typedef NormalCalculator::GLpoint GLpoint; 
} 

虽然我真的推荐只是简单地重构代码库。编译器发出仍将使用完整 类型名最 错误信息与合格范围和长型的名称成为一个真正的 可读性问题。

考虑这个代码,我经常用它来打印typenames调试 模板:

struct Foo 
{ 
    struct Bar {}; 
}; 

typedef Foo::Bar ImportedBar; 

// refactored bar 
struct Bar {}; 

template <typename> struct print; 

int main() 
{ 
    print<ImportedBar> x; // error: aggregate ‘print<Foo::Bar> x’ has incomplete type and cannot be defined 
    print<Bar> y; // error: aggregate ‘print<Bar> y’ has incomplete type and cannot be defined 
    return 0; 
} 

第一个版本仍然打印的全名。这可能看起来像一个小 交易给你,但考虑到如果这是一个 std::vector与模板默认参数和所有发生的事情。突然间 每个角色都有助于阅读本文。

+0

当你说重构代码库时,你的意思是组织我的代码,使GLpoint处于更方便的位置,使其他类更容易看到它? 无论如何,这种typedef方法正在为我工​​作,所以谢谢。 –

+0

@GuyJoelMcLean不,我的意思是实际将GLpoint移动到范围内。我添加了一个例子来说明我的意思。 – pmr