`“。不能出现在常量表达式中

时间:2010-05-09 07:37:55

标签: c++ templates

我收到以下错误:

`.' 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;
            }
        }

有人可以解释这个问题吗?

修改

Region的定义是:

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

Rangeminmax个变量时。

4 个答案:

答案 0 :(得分:3)

如果stakx的答案不够,您可能需要查看“min”和“max”变量。可能存在一些预处理器定义,阻止整个工作。

尝试添加

#undef min   
#undef max  

在您的代码之前,查看错误是否成立。

答案 1 :(得分:2)

我认为这是失败的,因为[]运算符不是对变量meother等的有效操作。

  • 您是否重载了[]课程中的Region<>运算符?如果是,它是否返回实际拥有这些minmax成员的对象? - 重载的运算符是返回对象,按引用引用的对象还是指向对象的指针? (在最后一种情况下,您需要将.替换为->。)

  • 如果没有重载[],则meother等必须声明为数组,以使您的代码有效。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

这可能是失败的,因为你还没有定义operator [](unsigned)const。我还建议您使用std::size_tint作为循环变量;看到unsigned是非常罕见的。但是,由于您使用的是无符号类型,因此逻辑选择是使用std::size_t。您也可以尝试调用this-&gt;运算符[](d)而不是我[d]作为一个完整性检查,尽管假设你的类实现了适当的运算符重载,你应该可以正常工作。