Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过同一命名空间中的另一个类型访问类型_C++ - Fatal编程技术网

C++ 通过同一命名空间中的另一个类型访问类型

C++ 通过同一命名空间中的另一个类型访问类型,c++,C++,我有两个结构A和B位于同一名称空间中。出于架构和兼容性原因,我希望通过B访问A 我尝试了以下不起作用的方法: #include <iostream> struct A { static void print() { std::cout << "hello SO!" << std::endl; } }; struct B { typedef A A; // error here }; int main()

我有两个结构
A
B
位于同一名称空间中。出于架构和兼容性原因,我希望通过
B
访问
A

我尝试了以下不起作用的方法:

#include <iostream>

struct A
{
    static void print()
    {
        std::cout << "hello SO!" << std::endl;
    }
};

struct B
{
    typedef A A;  // error here
};

int main()
{
    B::A::print();
    return 0;
}
如果我给它另一个名称(例如,
typedefaa2
),它会工作,但我希望它保持相同的名称

有趣的是,当我使用clang编译时,它实际上是有效的,但我需要同样使用gcc构建的代码

是否有某种方法可以实现这一点(即能够做到
B::A::print()


我目前正在使用C++11,但如果有必要,可能会使用更新的版本。

只需使用
typedef::a a
使用a=::a

这里有一个解决方案:

#include <iostream>

namespace NS {
struct A {
  static void print() { std::cout << "hello SO!" << std::endl; }
};

struct B {
  using A = NS::A;
};
}  // namespace NS

int main() {
  NS::B::A::print();
  return 0;
}
#包括
名称空间NS{
结构A{

静态无效打印(){std::cout@Ayxan
struct A
似乎在OP示例代码中的全局名称空间中。@Ayxan全局名称空间是一个名称空间。@Ayxan只不过是
foo::A
特定于
foo
名称空间,不适用于任何其他名称空间,如
bar
。我看不出任何理由认为OP不会重新启动LISTER您需要适当地更改命名空间。@ LooTor我考虑使用NexNeNeNe= ANSUngulyType < /Cult>更易读,因为它类似于赋值,例如<代码> int NeXYVAR=8765 @ LUTAUCT<代码>可以使用模板/代码>代码> TyPufF不能直接模板化。更简洁,速度也快了一点,但是+1给出了一个名称空间示例。
#include <iostream>

namespace NS {
struct A {
  static void print() { std::cout << "hello SO!" << std::endl; }
};

struct B {
  using A = NS::A;
};
}  // namespace NS

int main() {
  NS::B::A::print();
  return 0;
}