如何在C ++中没有范围解析运算符的情况下访问头成员类型?

时间:2018-02-24 09:46:52

标签: c++ scope-resolution

我正在学习C ++,这可能是一个愚蠢的问题。

我想为常见类型定义创建一个类,并通过包含它在许多cpp文件中使用它。 标题是" CommonTypesCls.h":

class CommonTypesCls
{
public:     
    typedef unsigned int UINT32;
    typedef int INT32;
}

我想在source.cpp中使用这些属性:

#include "CommonTypesCls.h"
int main()
{    
    int a = sizeof(UINT32);
    return 0;
}

是否可以使用包含的类'没有范围解析的成员类型?

4 个答案:

答案 0 :(得分:3)

不,除非您使用类型别名,否则无法实现。

using UINT32 = CommonTypesCls::UINT32;

但是你不应该这样做,因为一个类不适合收集类型定义。

将它们放在全局范围或命名空间中。

答案 1 :(得分:2)

Loooon之前,C ++标准包含 namespace ,正是出于这个目的(顺便说一下,你似乎正在重新发明一个轮子):

#include <cstdint>

namespace CommonTypesCls {
  using uint32 = std::uint32_t;
  using  int32 = std::int32_t;
}

int foo() {
  using namespace CommonTypesCls;
  uint32 a = 666;
}

如果您的类型特定于某个特定类,例如依赖于模板参数(例如std::vector<>::value_type),则必须在某处使用范围解析运算符,但您可以创建一个别名:

template<typename Container>
void bar(Container const&container)
{
  using value_type = typename Container::value_type;   // scope resolution
  value_type temporary_storage[4];
  for(auto const&x : container) {
    /* do something with x and using temporary_storage */
  }
}

但是,在使用auto变量声明时,通常不需要明确指定类型。

答案 2 :(得分:1)

类通常是提供通用定义的错误方法:使用namespace

此外,<stdint.h>提供了您认为需要的固定大小整数类型的特定定义。

也就是说,您可以使用public中的protectedC个定义,这些定义来自C派生类中的代码中不合格的类enum。但这将使用两个通常错误的工具:提供定义的类和获得访问权的继承。在某些情况下,它仍然适用,例如用于提供对imread("C:/Users/Requinala/AndroidStudioProjects/CLARTIPS/app/src/main/res/drawable/bluevelvet.png") 类型中的名称的访问权限。

答案 3 :(得分:0)

不确定

#include "CommonTypesCls.h"
int main()
{
    typedef typename CommonTypesCls::UINT32 UINT32;
    int a = sizeof(UINT32);
    return 0;
}

说真的,不是真的。