模板不透明的前瞻性声明

时间:2014-05-24 09:42:23

标签: templates c++11 opaque-pointers

我正在尝试创建一个同步双端队列,它将在不同的操作系统上有不同的实现(例如,在Android,Windows,Linux等上的std :: mutexes和条件变量 - 在sync_deque_stl.cpp中实现;大中央调度在iOS / MacOS上 - 在sync_deque_gcd.cpp中实现)。我也使用gyp来生成我的项目。

  1. 我有一个sync_deque.hpp文件,其中包含以下定义:

    template <class T> struct opaque_sync_deque;
    int insert(opaque_sync_deque<class T>&, T& item);
    ...
    
  2. 然后,我使用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,但是头文件在操作系统之间是通用的)
  3. 在.cpp文件中,我使用c ++类型别名(示例来自sync_deque_stl.cpp):

    template<typename T>
    using opaque_sync_deque = sync_deque_stl<T>;
    
  4. 这是有效的C ++ 11语法,但它与sync_deque.hpp中的forward声明冲突:

      

    sync_deque_stl.cpp:29:1:错误:重新定义&#39; opaque_sync_deque&#39;如   使用opaque_sync_deque = sync_deque_stl;

    的不同种类的符号

    是否仍然可以保留此设置(.hpp中的不透明模板类型和函数签名由所有操作系统+实现在不同操作系统的单独.cpp文件中共享)仍然可以编译?我相信我可以在每个目录中使用单独的/ gcd和/ stl以及单独的sync _deque头文件,然后使用gyp选择正确的头文件,但只有一个sync_deque.hpp会更容易。任何帮助表示赞赏。

0 个答案:

没有答案