C++中的位集操作

3
我试图将bitset参数传递给下面的函数,但是我无法成功:

错误:没有符合条件的函数调用search(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;
}

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


对我来说,在MSVC++上可以工作。如果你调用search<ELEMENTS>(...),你可能会得到一个更好的错误信息?(或者这可能为你编译?) - undefined
它在GCC 4.5.2下编译正常(在声明pos之后)。你使用的是哪个编译器/版本?(我怀疑你的编译器的std::bitset<>中,大小参数是unsigned long - 根据错误消息中的 "ul" 后缀可见 - 你应该将模板更改为也使用unsigned long)。 - undefined
在gcc 4.4.3上出现了段错误,位于bitset<NUMBER_OF_ELEMENTS> b;这一行代码。 - undefined
3个回答

6

你的函数模板期望其第一个参数为以下类型:

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);

0

在32位gcc 4.4.3中,这里需要进行的更改以避免段错误:

#define ELEMENTS 10000000

显然有一个最大尺寸,因为100000000导致bitset<NUMBER_OF_ELEMENTS> b;发生段错误。
b.set(i,1);

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

0

这段代码在我的编译器中运行得很好。唯一的错误是<’pos‘ 在此作用域未声明。(另外,我认为在调用时进行< int >和< unsigned int >的类型转换是多余的;这是不必要的)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接