I cannot compile a partial initialisation of a template [gcc 6.3.1]

Georgios Petasis via gcc-help gcc-help@gcc.gnu.org
Fri Jun 16 21:44:00 GMT 2017


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?

Kind regards,

George



More information about the Gcc-help mailing list