我正在尝试编译简单示例以使用boost concept_check
代码如下:
#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);
}
然后我收到以下错误:
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
由于
答案 0 :(得分:3)
如果您重新阅读代码,这应该不足为奇。它无法编译,因为概念检查失败。您断言foo
应该实现RandomAccessIterator概念。如果概念检查失败,库中的整个点就是产生编译错误(就像你看到的那样)。
但foo
不是迭代器。它是std::complex<double>
。
据我所知,它应该是BOOST_CONCEPT_ASSERT((RandomAccessIterator<v::iterator>));
。
您想要检查向量迭代器是否为随机访问迭代器。并不是存储在迭代器中的复数是随机访问迭代器。
答案 1 :(得分:2)
行。这只是编译问题。我不得不使用boost命名空间。
由于