/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 显示调用

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部