我正在尝试创建一个同步的双端队列,该队列将在不同的操作系统上具有不同的实现(例如,Android、Windows、Linux 等上的 std::mutex 和条件变量 - sync_deque_stl.cpp 中的实现;iOS 上的大型中央调度/ MacOS - sync_deque_gcd.cpp 中的实现)。我也在使用 gyp 来生成我的项目。
我有一个带有以下定义的 sync_deque.hpp 文件:
template <class T> struct opaque_sync_deque; int insert(opaque_sync_deque<class T>&, T& item); ...
然后,我使用 gyp 创建:
- MacOS/iOS 上的 Xcode 项目,包含 sync_deque_gcd.cpp,但不包含 sync_deque_stl.cpp
- Windows 上的 Visual Studio 项目,包含 sync_deque_stl.cpp,但不包含 sync_deque_gcd.cpp
- (基本上,每个操作系统都有自己的sync_deque实现.cpp,但头文件在操作系统之间是通用的)
在 .cpp 文件中,我使用 c++ 类型别名(示例取自 sync_deque_stl.cpp):
template<typename T> using opaque_sync_deque = sync_deque_stl<T>;
这是有效的 C++11 语法,但它与 sync_deque.hpp 中的前向声明冲突:
sync_deque_stl.cpp:29:1: 错误:使用 opaque_sync_deque = sync_deque_stl 将“opaque_sync_deque”重新定义为不同类型的符号;
是否仍然可以保留此设置(所有操作系统共享的 .hpp 中的不透明模板类型和函数签名 + 不同操作系统的单独 .cpp 文件中的实现)并且仍然可以编译?我相信我可以在每个目录中有单独的 /gcd 和 /stl 以及单独的 sync_deque 头文件,然后使用 gyp 选择正确的头文件,但是只有一个 sync_deque.hpp 会更容易。任何帮助表示赞赏。