One way of eliminating C4251 warning when using stl-classes in the dll-interface

后端 未结 4 1406
猫巷女王i
猫巷女王i 2020-12-08 01:08

It is not a good practice using stl-classes in the dll-interface as Common practice in dealing with warning c4251: class … needs to have dll-interface explains. An example i

4条回答
  •  鱼传尺愫
    2020-12-08 01:34

    I think you've got at least 5 possible options to solve this problem:

    1. You could still keep STL/template classes for your fields and also use them as parameter types, as long as you keep all the fields private (which is a good practice anyway). Here is a discussion about this. To remove the warnings you could simply use according #pragma statements.

    2. You could create small wrapper classes with private STL fields and expose fields of your wrapper class types to the public instead, but this would most probably only move the warnings to another places.

    3. You could use the PIMPL idiom to hide your STL fields in a private implementation class, which will not even be exported from your library nor be visible outside of it.

    4. Or you could actually export all the required template class specializations, as suggested in the C4251 warning, in a way that is described here. In short you would have to insert following lines of code before your HelloWorld class:

      ...
      #include 
      
      template class __declspec(dllexport) std::allocator;
      template class __declspec(dllexport) std::vector;
      template class __declspec(dllexport) std::string;
      
      class __declspec(dllexport) HelloWorld
      ...
      

      By the way, the order of those exports seems to be important: the vector class template uses the allocator class template internally, so the allocator instantiation has to be exported before the vector instantiation.

    5. The direct use of intrinsics is probably your worst option, but if you encapsulate your fields

      int *p_abc;
      int abc_len;
      

      in something like class MyFancyDataArray and the fields

      char *p_str;
      int str_len;
      

      in something like class MyFancyString, then this would be a more decent solution (similar to the one described at the second point). But it is probably not the best habit to reinvent the wheel too often.

提交回复
热议问题