将模板 class 拆分为头文件和实现文件时使用类型别名
using a type alias when splitting template class into header and implementation file
我有一个模板化的 class,它被分成一个 .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 可用吗?
当您定义 class 成员时,如 container<T>::getA
,成员名称(此处为 getA
)之后的内容将在 class 的范围内查找,但它之前的东西不是。本质上,如果编译器试图按顺序理解事物,当声明以 const TypeAlias&
开头时,它还不知道它应该查看 container<T>
以弄清楚 TypeAlias
可能意味着什么.
所以使用正常的函数语法,你需要指定 TypeAlias
是一个成员类型:
template <class T>
const typename container<T>::TypeAlias& container<T>::getA() const
{
return this->a;
}
但这是 "trailing return type" 语法的一个优点(在 C++11 及更高版本中有效):只需更改事物的顺序,它就可以让您在其中使用 class 的成员return 类型更简单:
template <class T>
auto container<T>::getA() const -> const TypeAlias&
{
return this->a;
}
我有一个模板化的 class,它被分成一个 .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 可用吗?
当您定义 class 成员时,如 container<T>::getA
,成员名称(此处为 getA
)之后的内容将在 class 的范围内查找,但它之前的东西不是。本质上,如果编译器试图按顺序理解事物,当声明以 const TypeAlias&
开头时,它还不知道它应该查看 container<T>
以弄清楚 TypeAlias
可能意味着什么.
所以使用正常的函数语法,你需要指定 TypeAlias
是一个成员类型:
template <class T>
const typename container<T>::TypeAlias& container<T>::getA() const
{
return this->a;
}
但这是 "trailing return type" 语法的一个优点(在 C++11 及更高版本中有效):只需更改事物的顺序,它就可以让您在其中使用 class 的成员return 类型更简单:
template <class T>
auto container<T>::getA() const -> const TypeAlias&
{
return this->a;
}