c ++中的位集操作

时间:2011-04-19 02:26:32

标签: c++ bitset

我正在尝试将bitset参数传递给下面的函数,但我无法:

  

错误:没有用于调用搜索的匹配函数(std :: bitset< 100000000ul>&,int,unsigned int,unsigned int)

以下是代码:

#include <bitset>


#define ELEMENTS 100000000
#define TRANSITION_POINT 500
using namespace std;

template<unsigned int N>
unsigned int search(bitset<N> &array, int value, unsigned int low, unsigned int high)  {

      unsigned int middle;
      .........
}

int main()  {

    const unsigned int NUMBER_OF_ELEMENTS = ELEMENTS;
    bitset<NUMBER_OF_ELEMENTS> b;

    unsigned int i = 0;
    i = TRANSITION_POINT;
    while(i < NUMBER_OF_ELEMENTS)  {

        b[i] = 1;
        i++;
    }

    pos = search(b, (int)1, (unsigned int)0, (unsigned int)NUMBER_OF_ELEMENTS);
    return 1;
}

我尝试调试代码,但无法找到问题所在。请有人帮忙。

3 个答案:

答案 0 :(得分:3)

您的函数模板要求其第一个参数为

类型
std::bitset<(unsigned int)NUMBER_OF_ELEMENTS>

b的类型为

std::bitset<(std::size_t)NUMBER_OF_ELEMENTS> 

这种微妙的差异意味着基于参数的类型推断将无法与您的模板匹配(除非std::size_t恰好是unsigned int的别名)。

有两种方法可以解决它:

  • 将模板的参数类型更改为std::size_t以匹配std::bitset
  • 的参数类型
  • 明确使用功能模板:
    pos = search<NUMBER_OF_ELEMENTS>(b, 1, 0, NUMBER_OF_ELEMENTS);

答案 1 :(得分:0)

代码在我的g++编译器中运行良好。我得到的唯一错误是'pos' is not declared in this scope。 (另外,我认为在调用int时对unsigned intsearch()进行类型转换是多余的;不需要这样做。

答案 2 :(得分:0)

使用32位gcc 4.4.3这里需要进行更改以使其不是段错误:

#define ELEMENTS 10000000

显然有最大尺寸,因为100000000导致bitset<NUMBER_OF_ELEMENTS> b;上的段错误

b.set(i,1);

原始b[i] = 1也导致了段错误。