Boost容器无法使用未定义(但已声明)的类进行编译

时间:2012-06-21 19:21:41

标签: c++ templates boost forward-declaration

以下代码无法在MSVStudio 2010 Express中编译,似乎是因为boost容器声明创建了包含类型的(静态?)实例。将boost::ptr_list<TypeContained>更改为std::list<TypeContained *>会导致它成功编译,但我喜欢boost容器。任何人都知道如何解决这个问题?错误为error C2504: 'Proxy<TypeContainer,TypeContained>' : base class undefined

#include <string>
#include <boost/ptr_container/ptr_list.hpp>

template <typename TypeContainer, typename TypeContained>
class Proxy
{
private:
    typename boost::ptr_list<TypeContained>::iterator m_clsPosition;

public:
    class Container {};
};

template <typename V> class Container;

template <typename V>
class Dependent : public Proxy<Container<V>, Dependent<V> >,
                  public V {};

template <typename V>
class Container : public Proxy<Container<V>, Dependent<V> >::Container {};

int main(int argc, char * argv[])
{
    Container<std::string> clsContainer;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

所以,使用clang进行编译时,问题在于尝试在TypeContainer上使用sizeof,但在这一点上,尚未确定TypeContainer的大小是什么,因为你还在定义它。

所以,根本问题,作为一个更简单的案例:

template <typename A>
class T {
    static const int a = sizeof(T<A>);
};

int main() {
    T<int> d;
}

换句话说,通过调用sizeof创建了循环依赖关系,但是使用指针(具有已知大小),永远不会创建此依赖关系。