2009-08-18 3 views
1

Je suis en train de compiler exemple simple d'utiliser le boost concept_checkCompile erreur en utilisant boost :: concept_check

code

est comme suit:

#include <vector> 
#include <complex> 
#include <algorithm> 
#include <boost/iterator.hpp> 
#include <boost/concept_check.hpp> 

template <class foo> 
void my_do_sort(std::vector<foo>& v) 
{ 
    BOOST_CONCEPT_ASSERT((RandomAccessIterator<foo>)); 
    std::stable_sort(v.begin(),v.end()) 
} 
int main() 
{ 
    std::vector<std::complex<double> > v; 
    v.push_back(std::complex<double>(1,3)); 
    v.push_back(std::complex<double>(2,4)); 
    my_do_sort(v); 
} 

J'obtiens alors l'erreur suivante:

g++ -I~/tmp/BOOST/boost_1_39_0 -g3 -ggdb -pedantic -pedantic-errors -Wall -Werror -O0 --save-temps con1.cpp -o con1  
con1.cpp: In function 'void my_do_sort(std::vector<foo, std::allocator<_CharT> >&)': 
con1.cpp:11: error: `*' cannot appear in a constant-expression 
con1.cpp:11: error: a call to a constructor cannot appear in a constant-expression 
con1.cpp:11: error: template argument 1 is invalid 
con1.cpp:11: error: template argument 1 is invalid 
con1.cpp:11: error: invalid type in declaration before ';' token 
make: *** [con1] Error 1 

Merci

+1

De même, un point-virgule vous manque après l'appel de tri. –

Répondre

2

OK. C'était juste un problème de compilation. J'ai dû utiliser l'espace de noms boost.

Merci

+0

Pour ma part, cela m'a beaucoup aidé! –

+5

Pourriez-vous s'il vous plaît poster la version corrigée de votre code? Merci. –

+0

Je crois que la ligne devrait lire 'BOOST_CONCEPT_ASSERT ((boost :: RandomAccessIterator ));' – Nick

3

Si vous relisez votre code, cela ne devrait pas être surprenant. Il ne parvient pas à compiler car la vérification du concept échoue. Vous affirmez que foo doit implémenter le concept RandomAccessIterator. Le point entier dans la bibliothèque est de produire une erreur de compilation (comme celle que vous voyez) si la vérification du concept échoue. Mais foo n'est pas un itérateur. c'est un std::complex<double>. Il devrait être BOOST_CONCEPT_ASSERT((RandomAccessIterator<v::iterator>)); autant que je peux voir.

Vous voulez vérifier que l'itérateur vectoriel est un itérateur à accès aléatoire. Non que les nombres complexes stockés dans l'itérateur soient des itérateurs à accès aléatoire.

+0

Désolé, j'ai fait erreur dans l'exemple. Cependant, je reçois cet échec même avec un code beaucoup plus simple, comme: class MyClass {}; void my_do_sort (MyClass c) { BOOST_CONCEPT_ASSERT ((LessThanComparable )); } – eran

+1

C'est pourquoi vous devriez toujours copier/coller vos exemples de code. Si nous ne pouvons pas faire confiance au code affiché pour être le même que le code que vous demandez, il est impossible de répondre à votre question. Modifiez votre question et ajoutez le code corrigé. – jalf

Questions connexes