【问题标题】:How can I resolve this namespace issue?如何解决此命名空间问题?
【发布时间】:2012-02-15 22:15:18
【问题描述】:

我有以下情况

    namespace A {
    //...
    class A {
        public:
        static void foo();
    }
    //...
    } //namespace A

当我尝试使用 A::foo() 从另一个类访问 foo() 时,编译器会抱怨“foo 不是 A 的成员”,而当我尝试使用 A::A::foo() 时,它会报错抱怨未解决的外部问题。

我该如何解决这个问题?我认为在同一个命名空间内创建一个类非常愚蠢并且会导致混乱,但我不是代码的作者,更改命名空间或类名会造成太多麻烦

【问题讨论】:

  • unresolved external 的错误意味着你没有实现A::A::foo() 而不是语法错误——事实上,编译器已经找到了你想要的!你在foo的实现中实现、编译、链接了吗?
  • 这里是一个使用A::A::foo()的例子,在键盘上实现foocodepad.org/3muVCfgM

标签: c++ namespaces


【解决方案1】:

您可以使用 :: 到达命名空间层次结构的顶部。所以你的班级是 ::A::A

编辑:上面回答了您关于命名空间的主要问题。但是正如其他人指出的那样,您的问题是您没有定义 foo.添加

inline void A::A::foo() { };

【讨论】:

    【解决方案2】:

    您想使用完整的资格,即A::A::foo()(如果您坚持真正完整的资格,甚至是::A::A::foo())。该函数未解析的事实仅意味着您尚未定义它:

    inline void A::A::foo() { ... }
    

    ...如果定义不在头文件中,则跳过inline

    顺便说一句,我不赞成你的论点“造成太多麻烦”:如果某些事情非常愚蠢(即您的团队成员同意这是错误的做法),请尽早解决问题!等待的时间越长,问题就越多,麻烦也就越多!

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2012-08-28
      • 2011-01-31
      • 1970-01-01
      相关资源
      最近更新 更多