2

我正在尝试将 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;
}

我试图调试代码,但找不到问题所在。有人可以帮忙吗。

4

3 回答 3

4

你的函数模板期望它的第一个参数是类型

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);
于 2011-04-19T03:22:47.430 回答
0

With 32 bit gcc 4.4.3 here are the changes that were needed to make it not segfault:

#define ELEMENTS 10000000

Apparently there's a max size, because 100000000 caused it to segfault on bitset<NUMBER_OF_ELEMENTS> b;

b.set(i,1);

The original b[i] = 1 also caused a segfault.

于 2011-04-19T02:55:16.983 回答
0

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

于 2011-04-19T02:41:52.647 回答