【问题标题】:Using a class in a namespace with the same name?在名称空间中使用同名的类?
【发布时间】:2010-12-05 02:10:06
【问题描述】:

我必须使用由 DLL 提供的 API,并带有这样的标头

namespace ALongNameToType {
    class ALongNameToType {
        static void Foo();   
    }
}

有没有一种方法可以使用 ALongNameToType::ALongNameToType::Foo 而不必每次都输入 ALongNameToType::ALongNameToType?我尝试使用using namespace ALongNameToType,但在 Visual Studio 中出现了模棱两可的符号错误。更改命名空间名称或删除它会给我链接器错误。

【问题讨论】:

标签: c++ class namespaces symbols


【解决方案1】:

我不知道什么是模棱两可的,但您可以避免与其他 Foo 函数的所有冲突,如下所示:

namespace ALongNameToType {
    struct ALongNameToType {
        static void Foo();   
    };
}

typedef ALongNameToType::ALongNameToType Shortname;

int main() {
    Shortname::Foo();
}

【讨论】:

  • 我完全忘记了 typedef...+1
  • 你实际上不必使用结构而不是类,对吗??
  • @2am:你不必,如果你愿意,你可以写class ALongNameToType { public: static void Foo(); };,但问题中的代码需要以一种或另一种方式修复。对于没有非公共成员的类型,我通常使用struct。您应该在适用于代码的任何样式指南中列出使用 struct 的条件。有些人将struct 专门用于 POD 类型,或者专门用于其定义将编译为 C 的类型,或者专门用于没有用户定义的构造函数或成员函数的类型,或者只是随意地将其用于他们认为“简单”的类型;- )
【解决方案2】:
namespace myns = ALongNameToType;

您似乎不能像这样为类范围设置别名:

// second ALongNameToType is a class
namespace myns = ALongNameToType::ALongNameToType;

也许你可以给它自己的函数起别名:

namespace foo
{
 class foo
 {
 public:
  static void fun()
  {

  }
 };
}

int main()
{
 void (*myfunc)() = foo::foo::fun;

 myfunc();
}

【讨论】:

    【解决方案3】:
    using ALongNameToType::ALongNameToType::Foo;
    

    如果您只想将其用作Foo()

    【讨论】:

    • 不幸的是,它在 Visual Studio 2008 中对我不起作用error C2885: 'ALongNameToType::ALongNameToType::Foo': not a valid using-declaration at non-class scope
    【解决方案4】:

    using 有三种使用方式。一种用于整个命名空间,一种用于命名空间中的特定事物,一种用于派生类,表示它不想隐藏在基类中声明/定义的内容。您可以使用其中的第二个:

    using ALongNameToType::ALongNameToType
    

    不幸的是,这对您不起作用(由于命名空间的歧义和具有相同名称的类)。将这种类型的使用与以前的答案结合起来应该可以消除歧义:

    namespace alntt = ALongNameToType;
    using alntt::ALongNameToType;
    

    但是一旦你重命名了命名空间,你就真的不需要using 语句了(只要你每次使用类时都能轻松编写(缩短的)命名空间:

    namespace alntt = ALongNameToType;
    alntt::ALongNameToType a;
    ...
    

    【讨论】:

    • 这给了我在 Visual Studio 2008 中的 error C2874: using-declaration causes a multiple declaration of 'ALongNameToType::ALongNameToType'
    • 哦,好吧,它在没有歧义的情况下很有用(例如,“使用 std::cout”)。
    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多