Thank you very much for your reply. That was very helpful and solved my
issue. I need:

int32_t n = default.value<int32_t>();

On Tue, Nov 19, 2019, 12:28 PM Dan Schmitt <dan.schm...@gmail.com> wrote:

> It can't tell from your use what type to return/cast the value to so
> its failing.
>
>     default_value.value<int64_t>();
>
> will try to do it as an int64_t to match the long.  Alternatively you
> should be able to do
>
>     int64_t value = default_value.value();
>
> and it can guess the type there.
>
> I suspect your problem lives in encode_type and what it's doing with
> the last parameter.
>
> On Tue, Nov 19, 2019 at 11:04 AM Mark Petronic <markpetro...@gmail.com>
> wrote:
> >
> > I am getting back into C++ but don't have much experience with templates
> so I am a reaching out for a hint here. I am trying to iterate over all the
> NodePrt nodes starting with the root node using avro::NodePtr& root =
> schema.root(); But I just cannot figure out how to code up the method call
> to get the default value from a primitive whose schema defines one. For
> example, a simple schema like this:
> >
> > {
> >     "name": "simple_schema",
> >     "type": "record",
> >     "fields": [
> >         {
> >             "name": "int_stat",
> >             "type": "long",
> >             "default": 999
> >         }
> >     ]
> > }
> >
> > I want to get my hands on that 999 value. Here is a snippet of a method
> that gets a NodePtr to an Avro record, retrieves the defaultValueAt(i) just
> fine, but how do I code up the call to retrieve the value() 999?
> >
> > What should the return value look like given the default could be
> various types depending on the schema?
> > What should this call look like?  default_value.value();
> >
> > Thanks for any insight and guidance!!!
> >
> > void Encoder::encode_record(
> >         const avro::NodePtr& n,
> >         const csv_data_map& csv_data,
> >         avro::EncoderPtr encoder) const
> > {
> >     size_t c = n->leaves();
> >     cout << "Processing Avro record, name = " << n->name() << endl;
> >     for (size_t i = 0; i < c; ++i) {
> >         avro::GenericDatum default_value = n->defaultValueAt(i);
> >         // THIS IS THE PROBLEM PART I CANNOT FIGURE OUT
> >         default_value.value();
> >         encode_type(n->leafAt(i), n->nameAt(i), csv_data, encoder,
> default_value);
> >     }
> > }
> >
> > Building file: ../src/encoder.cpp
> > Invoking: GCC C++ Compiler
> > g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP
> -MF"src/encoder.d" -MT"src/encoder.o" -o "src/encoder.o"
> "../src/encoder.cpp"
> > ../src/encoder.cpp: In member function ‘void
> Encoder::encode_record(const NodePtr&, const csv_data_map&,
> avro::EncoderPtr) const’:
> > ../src/encoder.cpp:257:29: error: no matching function for call to
> ‘avro::GenericDatum::value()’
> >          default_value.value();
> >                              ^
> > ../src/encoder.cpp:257:29: note: candidates are:
> > In file included from ../src/encoder.cpp:7:0:
> > /usr/local/include/avro/GenericDatum.hh:98:35: note: template<class T>
> const T& avro::GenericDatum::value() const
> >      template<typename T> const T& value() const;
> >                                    ^
> > /usr/local/include/avro/GenericDatum.hh:98:35: note:   template argument
> deduction/substitution failed:
> > ../src/encoder.cpp:257:29: note:   couldn't deduce template parameter ‘T’
> >          default_value.value();
> >                              ^
> > In file included from ../src/encoder.cpp:7:0:
> > /usr/local/include/avro/GenericDatum.hh:109:29: note: template<class T>
> T& avro::GenericDatum::value()
> >      template<typename T> T& value();
> >                              ^
> > /usr/local/include/avro/GenericDatum.hh:109:29: note:   template
> argument deduction/substitution failed:
> > ../src/encoder.cpp:257:29: note:   couldn't deduce template parameter ‘T’
> >          default_value.value();
> >                              ^
> > make: *** [src/encoder.o] Error 1
> >
> >
>

Reply via email to