以循环方式使用来自另一个 class 的 typedef
using a typedef from another class in a circular manner
这是一道看C++语言极限的题。
大多数循环 class 依赖关系可以通过前向声明和指针解决。
但我想知道是否可以通过某种方式解决这个问题:
struct Y; // forward declaring Y does not solve the problem
struct X {
using T = int;
using Other = Y::T; //error: incomplete type 'Y' named in nested name specifier
};
struct Y {
using T = float;
using Other = X::T;
};
用人眼解析,你可以很容易地看到在这段代码中 X::Other
可以简单地理解为 float
因为 Y::T
不依赖于任何东西。但是我不知道有什么语法允许 "forward declare a typedef",比如 typename Y::T = float;
(但 C++ 总是有未开发的黑暗角落)或允许上述类型定义的任何方法或习惯用法。
那么有没有办法解决以上问题呢? (具体来说:每个 class 使用另一个 class 的 typedef - 无需将 typedef 移到 class 之外)
您可以将 X 设为模板结构。像这样。
template <typename YType>
struct X {
using T = int;
using Other = typename YType::T;
};
struct Y {
using T = float;
using Other = X<Y>::T;
};
int main()
{
X<Y> x;
}
这不是一个完美的解决方案,但当你遇到这样的极端情况时,有时你需要做一些修改。
这是一道看C++语言极限的题。
大多数循环 class 依赖关系可以通过前向声明和指针解决。
但我想知道是否可以通过某种方式解决这个问题:
struct Y; // forward declaring Y does not solve the problem
struct X {
using T = int;
using Other = Y::T; //error: incomplete type 'Y' named in nested name specifier
};
struct Y {
using T = float;
using Other = X::T;
};
用人眼解析,你可以很容易地看到在这段代码中 X::Other
可以简单地理解为 float
因为 Y::T
不依赖于任何东西。但是我不知道有什么语法允许 "forward declare a typedef",比如 typename Y::T = float;
(但 C++ 总是有未开发的黑暗角落)或允许上述类型定义的任何方法或习惯用法。
那么有没有办法解决以上问题呢? (具体来说:每个 class 使用另一个 class 的 typedef - 无需将 typedef 移到 class 之外)
您可以将 X 设为模板结构。像这样。
template <typename YType>
struct X {
using T = int;
using Other = typename YType::T;
};
struct Y {
using T = float;
using Other = X<Y>::T;
};
int main()
{
X<Y> x;
}
这不是一个完美的解决方案,但当你遇到这样的极端情况时,有时你需要做一些修改。