【问题标题】:using a type alias when splitting template class into header and implementation file将模板类拆分为头文件和实现文件时使用类型别名
【发布时间】:2018-11-10 14:01:52
【问题描述】:

我有一个模板类,它被分成一个.hpp 文件和一个.ipp,其中有一个相当长的类型。在重构时,我想为该类型编写一个类型别名,以便代码更具可读性。但无论我做什么,我都无法在 .ipp 文件中识别类型别名。

这是我正在尝试做的一个简单示例:

container.hpp:

template <class T>
class container {
public:
    using TypeAlias = T;
    container(const TypeAlias& a);
    const TypeAlias& getA() const;
private:
    TypeAlias a;
};

#include "container.ipp"

container.ipp:

template <class T>
container<T>::container(const TypeAlias& a) : a(a)
{

}

template <class T>
const TypeAlias& container<T>::getA() const
{
    return this->a;
}

编译时出现以下错误:

./container.ipp:8:7: error: unknown type name 'TypeAlias'
const TypeAlias& container<T>::getA() const

显然在这种情况下,引入TypeAlias 没有多大意义,但在我的实际程序中,它可能会产生巨大的影响。我可以做些什么来使 .ipp 文件中的 TypeAlias 可用?

【问题讨论】:

  • 我假设 #include "container.ipp" 实际上是在 container.hpp 的末尾,而不是在 container.ipp 的开头。
  • @aschepler 是的,我复制错了。

标签: c++ templates typedef using


【解决方案1】:

当你定义一个像container&lt;T&gt;::getA这样的类成员时,成员名称之后的东西(这里是getA)会在类的范围内查找,但它之前的东西不会。本质上,如果编译器试图按顺序理解事物,那么当声明以const TypeAlias&amp; 开头时,它还不知道应该查看container&lt;T&gt; 的内部以找出TypeAlias 的含义。

因此,使用普通函数语法,您需要指定 TypeAlias 是成员类型:

template <class T>
const typename container<T>::TypeAlias& container<T>::getA() const
{
    return this->a;
}

但这是“尾随返回类型”语法的优点之一(在 C++11 及更高版本中有效):只需更改事物的顺序,它就可以让您更简单地在返回类型中使用类的成员:

template <class T>
auto container<T>::getA() const -> const TypeAlias&
{
    return this->a;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多