-1

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

我想为通用类型定义创建一个类,并通过 inluding 在许多 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

4 回答 4

3

不,除非您使用类型别名,否则这是不可能的。

using UINT32 = CommonTypesCls::UINT32;

但是您不应该这样做,因为类不是收集类型定义的合适位置。

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

于 2018-02-24T09:55:16.693 回答
2

很久以前,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变量声明时,通常不需要显式指定类型。

于 2018-02-24T10:00:03.333 回答
1

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

此外,您似乎想要的固定大小整数类型的特定定义由<stdint.h>.

也就是说,您可以public在派生protected自. 但这将使用两个通常错误的工具:提供定义的类和获得访问权限的继承。在某些情况下它仍然是合适的,例如提供对类型中名称的访问。CCenum

于 2018-02-24T10:17:57.297 回答
0

当然:

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

不过说真的,不是真的。

于 2018-02-24T09:55:38.553 回答