错误:预期a&#34 ;;"使用std :: vector< ...> :: const_iterator无信息编译错误?

时间:2014-08-06 09:36:08

标签: c++

在围绕nlopt优化库创建希望更好的OO包装器的上下文中,可以使用Eigen类型定义目标和约束函数签名和实现,我有以下问题:

编译:

namespace nlopt {
template <class Data>
struct Oracle {
    typedef boost::tuple<double, VectorXd>   (*f_t) (const VectorXd&, Data& data);
    typedef boost::tuple<VectorXd, MatrixXd> (*mf_t)(const VectorXd&, Data& data);
};
};

/// Concrete Nlopt adapter search space implementation.
/**
 * Concrete Nlopt adapter search space implementation.
 */
template <class ConstraintData>
class NloptSpace : public ContinuousSpaceInterface<double, VectorXd> {
public:
    /// nonlinear constraints
    struct NonlinearConstraint {
        typename nlopt::Oracle<ConstraintData>::f_t func_; ConstraintData* data_; double tol_;
        NonlinearConstraint(typename nlopt::Oracle<ConstraintData>::f_t func, ConstraintData* data, double tol) {
            func_ = func;
            data_ = data;
            tol_ = tol;
        }
    };
    // ...
};

typedef typename NloptSpace<ConstraintData>::NonlinearConstraint NonLinearConstraint;
const std::vector<NonLinearConstraint>& inequality_constraints = space.inequality_constraints();

然而,这个额外的行不能编译,并且给出了以下完全没有信息的错误:

std::vector<NonLinearConstraint>::const_iterator iter;

error: expected a ";"
     std::vector<NonLinearConstraint>::const_iterator iter;
                                                 ^

顺便说一下,如果你想知道我是否有正确的包含这也包括:

std::vector<int>::const_iterator iter;

这也编译:

inequality_constraints.begin(); // can't assign it to anything without the compiler error

不知何故,编译器并不喜欢NonLinearConstraint模板作为向量常量迭代器,但它确实没有提供任何关于错误的提示。

我不希望有人帮我解决这个问题,但是给我一个指针,告诉我如何获得有关此编译器错误的更多信息。

1 个答案:

答案 0 :(得分:1)

std::vector<NonLinearConstraint>::const_iterator是一个从属名称 - 它取决于模板参数ConstraintData。标准说(§14.6[name.res] / p2):

  

模板声明或定义中使用的名称,即   依赖于模板参数,假定不命名类型   除非适用的名称查找找到类型名称或名称是   由关键字typename限定。

因此,您需要使用

  typename std::vector<NonLinearConstraint>::const_iterator iter;
//^^^^^^^^

否则,编译器会认为std::vector<NonLinearConstraint>::const_iterator没有命名类型(尽管它知道,可以有std::vector的特化,它定义了一个名为const_iterator的成员变量。

现代编译器倾向于为此提供更好的错误消息。例如,g ++ 4.8产生:

test.cpp:46:2: error: need 'typename' before 'std::vector<typename NloptSpace<ConstraintData>::NonlinearConstraint>::const_iterator' because 'std::vector<typename NloptSpace<ConstraintData>::NonlinearConstraint>' is a dependent scope
  std::vector<NonLinearConstraint>::const_iterator iter;
  ^
test.cpp:46:51: error: expected ';' before 'iter'
  std::vector<NonLinearConstraint>::const_iterator iter;