代码之家  ›  专栏  ›  技术社区  ›  CuppM

带有枚举模板参数的boost::container::vector-不是合法的基类

  •  2
  • CuppM  · 技术社区  · 16 年前

    我正在使用带有Boost v1.42.0库的Visual Studio 2008。如果使用枚举作为模板参数,则在使用 push_back() . 编译器错误为: 'T': is not a legal base class 错误的位置是 move.hpp 第79行。

    #include <boost/interprocess/containers/vector.hpp>
    
    class Test {
    public:
     enum Types {
      Unknown = 0,
      First = 1,
      Second = 2,
      Third = 3
     };
     typedef boost::container::vector<Types> TypesVector;
    };
    
    int main() {
     Test::TypesVector o;
    
     o.push_back(Test::First);
    
     return 0;
    }
    

    如果我使用 std::vector 相反,它起作用了。如果我先调整Boost版本的大小,然后使用 [] 接线员它也能工作。

    有什么办法可以用 向后推( ?


    错误的模板回溯:
    error C2516: 'T' : is not a legal base class
    1>        main.cpp(21) : see declaration of 'T'
    1>        main.cpp(21) : see reference to class template instantiation 'boost::interprocess::rv' being compiled
    1>        with
    1>        [
    1>            T=Test::Types
    1>        ]
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Vicente Botet Escriba    16 年前

    我觉得你发现了一只虫子。我已经发布到BoostML来跟踪这个问题并尝试获得更多信息。

    目前,我看到的唯一解决方法是将RV类专门化如下,但我不确定这是否适用于所有情况。

    namespace boost {
    namespace interprocess {
    
    template <>
    class rv<Test::Types> 
    {
       Test::Types v;
       rv();
       ~rv();
       rv(rv const&);
       void operator=(rv const&);
       operator Test::Types() const {return v;}
    };
    
    }}
    

    如果这不起作用,可以尝试使用int而不是枚举。

     enum {
      Unknown = 0,
      First = 1,
      Second = 2,
      Third = 3
     };
     typedef int Types; 
    

    当然,这有损于枚举安全性的缺点。

        2
  •  0
  •   Potatoswatter    16 年前

    听起来Boost有一些错误的逻辑来决定是否从 T 或者没有。

    天真地说,除了本机类型或指针之外,任何类型都可以用作基。然而 enum S既不是基,也不是原始的。也许他们没有解释这一点。

    看起来Boost错误地确定了 枚举 S与它的右值引用仿真兼容。

    解决这一问题的最佳方法是避免在Boost进程间结构中使用枚举。

    像黑客一样

    namespace boost {
    namespace interprocess { // get inside boost
    template<>
    class is_movable<Test::Types> // add custom specialization of is_movable
       : public ::boost::mpl::bool_<false>
    {};
    }}
    

    可能会修补。未测试。

    在您的 #include 所以它出现在第一次使用之前。