我正在开发一个通用的遗传算法库,其中每个生物的染色体是其在内存中的位表示。例如,如果我想突变一个生物,我会随机地翻转对象本身的位。
起初,我尝试使用C++标准库中的bitset类,但是,当转换回对象T时,我的唯一选择是使用to_ullong成员函数,对于比unsigned long long的大小更大的位数表示来说,这是一个问题。
然后,我决定创建一个通用库,用于任何对象T的位操作,这样我就可以直接将这些操作应用于对象本身,而不是先将它们转换为一个bitset。
因此,您可以看到我想要实现的目标,这里是库中的一个函数:
这个功能如果能运行起来就太好了,但是现在我从VC++ 2015 RC编译器收到了以下错误消息:
严重错误 代码 描述 项目 文件 行 错误 C2677 二进制 '^': 找不到接受类型 'T' 的全局运算符(或没有可接受的转换) GeneticAlgorithm path\geneticalgorithm\geneticalgorithm\BitManip.hpp 57
如果我纠正这个错误,那么其他运算符也会出现问题。
我以前没有在我的代码中使用过位运算符,所以我猜这些运算符不能与任何对象一起使用?如果是这样,我该如何解决这个问题?
起初,我尝试使用C++标准库中的bitset类,但是,当转换回对象T时,我的唯一选择是使用to_ullong成员函数,对于比unsigned long long的大小更大的位数表示来说,这是一个问题。
然后,我决定创建一个通用库,用于任何对象T的位操作,这样我就可以直接将这些操作应用于对象本身,而不是先将它们转换为一个bitset。
因此,您可以看到我想要实现的目标,这里是库中的一个函数:
template<typename T>
void flip(T& x, size_t const i)
{
x ^= 1 << i;
}
而在 GA 库中,它被用于如下代码:
template<typename T>
void GeneticAlgorithm<T>::mutate(T& organism, double const rate)
{
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(0, 1);
for(size_t i = 0; i < m_nBits; ++i)
if(dist(mt) <= rate)
bit::flip(organism, i);
}
这个功能如果能运行起来就太好了,但是现在我从VC++ 2015 RC编译器收到了以下错误消息:
严重错误 代码 描述 项目 文件 行 错误 C2677 二进制 '^': 找不到接受类型 'T' 的全局运算符(或没有可接受的转换) GeneticAlgorithm path\geneticalgorithm\geneticalgorithm\BitManip.hpp 57
如果我纠正这个错误,那么其他运算符也会出现问题。
我以前没有在我的代码中使用过位运算符,所以我猜这些运算符不能与任何对象一起使用?如果是这样,我该如何解决这个问题?