On 16 June 2017 at 22:44, Georgios Petasis via gcc-help <gcc-help@xxxxxxxxxxx> wrote: > Hi all, > > I am trying to compile the following code, I am getting an error, and I am > unable to fix the error. > > I am trying to compile this: > > template<typename Pattern> > class HasAttributeMatchingValue: public > AnnotationUnaryPredicateWithStates<std::string, Pattern> { > bool operator() (const ELEP::CDM::Annotation& ann) const { > return ann.containsAttributeMatchingValue(std::get<0>(m_state), > std::get<1>(m_state)); > }; > }; > > The error I am getting is: > > `m_state` was not declared in this scope: return > ann.containsAttributeMatchingValue(std::get<0>(m_state), > std::get<1>(m_state)); > > If I use instead: > > template<typename Pattern> > class HasAttributeMatchingValue: public > AnnotationUnaryPredicateWithStates<std::string, std::string> { > bool operator() (const ELEP::CDM::Annotation& ann) const { > return ann.containsAttributeMatchingValue(std::get<0>(m_state), > std::get<1>(m_state)); > }; > }; > > It compiles without problem. > > AnnotationUnaryPredicateWithStates is a template: > > template<class... States> class AnnotationUnaryPredicateWithStates : > public UnaryPredicateWithStates<ELEP::CDM::Annotation, States ... > {}; > > template<class Arg, class... States> class UnaryPredicateWithStates : > public UnaryFunctionWithStates<Arg, bool, States ... > {}; > > template<class Arg, class Result, class... Ts> > class UnaryFunctionWithStates : public UnaryFunction<Arg, Result> { > public: > UnaryFunctionWithStates() = default; > template <class... Args> UnaryFunctionWithStates(Args&&... args) : > m_state(std::forward<Args>(args)...) {}; > protected: > std::tuple<Ts...> m_state; > }; > > template<class Arg, class Result> class UnaryFunction { > public: > virtual Result operator()(const Arg &) const = 0; > }; > > What am I doing wrong? See https://gcc.gnu.org/wiki/VerboseDiagnostics#dependent_base