2010-05-09 66 views
2

,我发现了以下错误:`。'不能出现在常数表达式

`.' cannot appear in a constant-expression 

此功能(4号线):

bool Covers(const Region<C,V,D>& other) const { 
     const Region& me = *this; 
     for (unsigned d = 0; d < D; d++) { 
      if (me[d].min > other[d].min || me[d].max < other[d].max) { 
       return false; 
      } 
     } 

任何人都可以说明问题吗?

编辑:

地区的定义是:

template <typename C, typename V, unsigned D> 
class Region : public boost::array<Detail::Range<C>,D> 

Rangeminmax变量。

回答

2

试用你的​​代码告诉我,编译器在me[d].max < other[d].max部分有问题。所以这个点的问题是虚假的。相反,编译器在比较运算符上存在问题。只是恢复比较使得编译器错误神奇消失:

if (me[i].min > other[i].min || other[i].max > me[i].max) { 
     return false; 
} 
2

我假设,因为[]运营商是不是在你的变量meother有效的操作失败等

  • 重载[]操作Region<>类?如果是这样,它是否返回一个实际上有这些minmax成员的对象? —重载操作符是否返回对象,引用对象或指向对象的指针? (在后一种情况下,你需要通过->更换.

  • 如果没有超载[],然后meother等将必须声明为数组为您代码才有效。

+0

'[]'操作符被重载(从boost :: array'继承)。 – 2010-05-09 11:48:06

0

这可能是因为您没有定义operator [](unsigned)const而失败。我还建议你使用std::size_tint作为你的循环变量;看到unsigned是非常罕见的。因为您使用的是无符号类型,所以合乎逻辑的选择是使用std::size_t。你也可以尝试调用this-> operator [](d)而不是我[d],只是作为一个理智检查,尽管你应该工作得很好,假设你的类实现了适当的操作符重载。

3

如果stakx的答案是不够的,你可能想看看“最小”和“最大”的变量。可能有一些预处理器的定义,阻止整个事情的工作。

尝试增加

#undef min 
#undef max 

只是你的代码之前,看看错误立场。

相关问题