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 <[email protected]> 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
>
>