2012-06-21 1 views
2

Le code suivant ne parvient pas à se compiler dans MSVStudio 2010 Express et semble être dû au fait que la déclaration du conteneur d'amélioration crée une instance (statique?) Du type contenu. Changement boost::ptr_list<TypeContained> à std::list<TypeContained *> provoque la compilation avec succès, mais j'aime les conteneurs d'appoint. Quelqu'un a une idée de comment je peux contourner cela? L'erreur est error C2504: 'Proxy<TypeContainer,TypeContained>' : base class undefinedLe conteneur Boost ne peut pas être compilé avec une classe indéfinie (mais déclarée)

#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; 
} 
+0

quelles sont les options de votre compilateur? – gda2004

Répondre

0

donc, la compilation avec clang, le problème réside dans le coup de pouce essayant d'utiliser sizeof sur TypeContainer, mais à ce stade, il est pas encore déterminé quelle est la taille de TypeContainer est, puisque vous êtes encore le définir.

Ainsi, la racine du problème, comme simple cas:

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

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

En d'autres termes, il y a une dépendance de boucle créée en invoquant sizeof, mais en utilisant un pointeur (qui a une taille connue), cette dépendance est jamais créé.

Questions connexes