Templates 模板化不透明转发声明

Templates 模板化不透明转发声明,templates,c++11,opaque-pointers,Templates,C++11,Opaque Pointers,我正在尝试创建一个同步的双端队列,该队列将在不同的操作系统上有不同的实现,例如,Android、Windows、Linux等系统上的std::mutex和条件变量-在sync_deque_stl.cpp中实现;iOS/MacOS上的中央大调度-同步执行\u deque\u gcd.cpp。我还使用gyp生成我的项目 我有一个sync_deque.hpp文件,具有以下定义: template <class T> struct opaque_sync_deque; int insert(

我正在尝试创建一个同步的双端队列,该队列将在不同的操作系统上有不同的实现,例如,Android、Windows、Linux等系统上的std::mutex和条件变量-在sync_deque_stl.cpp中实现;iOS/MacOS上的中央大调度-同步执行\u deque\u 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文件中,我使用了从CycYDEQuySt.LCPP:

中获取的C++类型别名实例。
template<typename T>
using opaque_sync_deque = sync_deque_stl<T>;
这是有效的C++11语法,但与sync_deque.hpp中的转发声明冲突:

sync_deque_stl.cpp:29:1:错误:将“不透明”重新定义为 使用不透明的sync\U deque=sync\U deque\U stl的不同类型的符号


是否仍可以将此设置不透明的模板类型和函数签名保留在所有OSs+实现共享的.hpp中,并将其保存在不同OSs的单独.cpp文件中,然后继续编译?我相信我可以在每个目录中有单独的/gcd和/stl以及单独的sync_deque头文件,然后使用gyp选择正确的头文件,但是只使用一个sync_deque.hpp会更容易。感谢您的帮助

如果要在包括sync_deque.hpp的其他源文件中创建类型为opaque_sync_deque的对象,则需要在该头文件中提供类模板定义。还有其他方法,例如PIMPL来隐藏实现。为什么不直接向前声明sync\u deque\u stl呢?