c++ - 在相应的源文件中使用头文件中的别名

标签 c++

我刚刚开始学习更多 C++,并且正在编写一个小型渲染引擎作为示例案例研究。当我开始实现更多代码时,我对键入类似

的类型感到恼火
std::vector<std::vector<int>>

一遍又一遍。正如你们大多数人已经知道的那样,如果您在上述 vector 上循环,情况会变得更糟

for (std::vector<std::vector<Tile>>::const_iterator layerRow = ...) {}

因为这不仅烦人而且很容易出错,所以我研究了使用 typedef 并很快将其更改为别名,遵循 Scott Meyers 在“更有效的 C++”中的建议。 我现在遇到了一个问题,我似乎无法解决这个问题。给定以下两个文件(对应的头文件和源文件):

map .h:

class Map
{
  public:
    using tileLayerVector_t = std::vector<std::vector<Tile>>;
    using rawDataLayerVector_t = std::vector<std::vector<int>>;
    tileLayerVector_t getTileLayer(const std::string pLayerName) const;
    void generateTileMapLayer(const std::string pMapLayerName, const rawDataLayerVector_t pRawMapData, const std::shared_ptr<Texture> pTexture);
}

map .cpp:

#include <map.h>

tileLayerVector_t Map::getTileLayer(const std::string pLayerName) const
{
  return mapLayers.at(pLayerName);
}


void Map::generateTileMapLayer(const std::string pMapLayerName, const 
rawDataLayerVector_t pRawMapData, const std::shared_ptr<Texture> pTexture)
{
  int tileCount = 0;
  int xPos = 0;
  int yPos = 0;

  ...

  std::pair<std::string, tileLayerVector_t> tileLayer(pMapLayerName, tileMapLayer);
  mapLayers.insert(tileLayer);
}   

函数 generateTileMapLayer() 可以正常编译,没有问题。一旦我实现 getTileLayer(),UI 就会给我一个错误“标识符‘tileLayerVector_t’未定义”,并且编译器给我一些关于缺少“;”的奇怪错误。某处。如果我将 getTileLayer() 放在注释中,此编译器错误就会消失。 我不明白为什么我可以在函数 generateTileMapLayer() 中使用别名作为 HashMap 的类型定义,但不能将它用作 getTileLayer() 的返回类型。我将 Map::tileLayerVector_t 作为返回类型,它可以工作。为什么它在 generateTileMapLayer() 中没有命名空间的情况下也能正常工作?

也许有人可以帮我解决这个问题。提前致谢!

最佳答案

一个类定义了一个范围。您如何访问给定范围内的内容取决于您编写的代码是在该范围内还是在该范围外。

因此,当您在 using tileLayerVector_t = ...; class Map 中进行声明时,您正在为新类型提供别名 Map::tileLayerVector.

这就是为什么类内部的代码可以不加限定地使用类型,而外部的代码却不能。

您可以将 using 声明移到类之外,但这会污染全局命名空间。我认为,更好的解决方案是在需要的地方简单地限定类型:

Map::tileLayerVector_t Map::getTileLayer(...) // must qualify type here
{
    tileLayerVector_t temp = ...; // inside a class method, no problem here
}

更现代的解决方案是使用“类型推断”。我相信您至少需要一个 C++11 兼容的编译器才能利用此功能。我的理解是,尾随返回类型允许编译器推迟建立实际类型,直到生成函数签名之后,此时范围已经建立。

auto Map::getTileLayer(...) -> tileLayerVector_t
{
    ....
}

关于c++ - 在相应的源文件中使用头文件中的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53728650/

相关文章:

c++ - 如何在 C++ 中打印通用 map

c++ - 重载比较运算符以在 C++ 中使用 STL 排序

c++ - 部署使用英特尔 Parallel Studio 的项目时出现问题

c++ - 如何安装ConvNet库?

c++ - C 标准库的(其余部分)未涵盖 C 标准库的哪些部分?

c++ - 如何在 C++ 中检查 vector 中的哪些对象

c++ - 当程序集中的 operator delete() 删除 vptr 指针时?

c++ - Boost:Spirit:Karma:如何获取输出的当前位置?

c++ - 如何使用 waitpid() 获取子进程的状态?

C++ 多态性,不完全向下转型