dimanche 15 septembre 2019

User-defined literal operator isn't recognised in my class

I have written a class that uses literal operators to indicate a measurement error to be used in physical applications. I have defined a literal ""_err that takes long double as an argument and returns a struct called Error. For instance, 1.3_err.

A friend declaration for this literal is placed in the header file TStat.h, and the definition is placed in TStat.cpp, as you'll see in the code below.

However, I got an error when compiling with an example like b = 0.4_err where b is Error. In the error it says it couldn't find the literal operator. You may check the error message at the end of this question.

I have tried many combinations, like defining the literal internally or externally, etc. I have searched similar questions but everything seems fine in the code, just like it is described by many tutorials and other C++ sources.

As a particle physicist, I use a C/C++ library called ROOT developed by CERN which is actually a C/C++ interpreter. There, I could use this class without any errors (I haven't used any ROOT class at all). However, when I compile my code by g++ with c++11 flag, no match for the literal could be found.

This is the header file:

#ifdef TSTAT_H
#define TSTAT_H

namespace TStat {
    struct Error {
        // ...
    }

    class Double {
        // constructors, etc.
        // ...

        friend Error operator "" _err (long double);
    }
}

and this is the TStat.cpp file:

#include "TStat.h"

using namespace TStat;

// ...

TStat::Error operator"" _err(long double err) {
    TStat::Error error;
    // ...
    return error;
}

When compiled with the following command in the terminal (I am using MacOS)

g++ -Wall -g -std=c++11 example.cpp TStat.cpp -o example.exe

I get an error saying

example.cpp:11:12: error: no matching literal operator for call to
  'operator""_err' with argument of type 'long double' or
  'const char *', and no matching literal operator template
b = 0.4_err;

Aucun commentaire:

Enregistrer un commentaire