/usr/include/c++/4.9/bits/stl_iterator_base_types.h:165:53: error: ‘int’ is not a class, struct, or union type
清泛原创
先看下面的代码(来自: SO):
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
double distance(int a, int b)
{
return fabs(a-b);
}
int main()
{
vector<int> age;
age.push_back(10);
age.push_back(15);
cout << distance(age[0],age[1]);
return 0;
}
这段代码初看起来并无错误,编译时提示上述错误,原因在于使用std命名空间,而std命名空间中已经有了std::distance函数.
原型为:
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (InputIterator first, InputIterator last);
这个函数要求两个参数至少都满足InPut Iterator约束,y而age[0]为int类型,不满足这个约束,因此导致上面的错误信息.
这段代码的错误之处,在于std命名空间中的distance屏蔽了本地的distance函数,解决方法即为,显式调用本地方法,例如使用
::distance(age[0],age[1])
或者将distance放在一个命名空间中,例如:
namespace foo
{
double distance(int a, int b)
{
return fabs(a-b);
}
}
int main()
{
foo::distance(x,y); //now you're calling your own distance function.
}
或者不使用命名空间std,显式声明std::vector也可以解决。
上一篇:error: cannot dynamic_cast ‘b’ (of type ‘class Base*’) to type ‘class Derived
下一篇:auto_ptr is not dereferencable