C++ 用户定义的文字运算符为';我在班上没被认出来

C++ 用户定义的文字运算符为';我在班上没被认出来,c++,c++11,user-defined-literals,C++,C++11,User Defined Literals,我编写了一个类,它使用文字运算符来指示物理应用程序中使用的测量错误。我定义了一个literal“”\u err,它将长双精度作为参数,并返回一个名为Error的结构。例如,1.3\u err 此文本的friend声明放在头文件TStat.h中,定义放在TStat.cpp中,如下面的代码所示 但是,我在使用类似b=0.4_err的示例进行编译时出错,其中b是error。在错误中,它表示找不到文本运算符。您可以检查问题末尾的错误消息 我尝试了很多组合,比如定义内部或外部的文字等。我已经搜索了类似的问

我编写了一个类,它使用文字运算符来指示物理应用程序中使用的测量错误。我定义了一个literal
“”\u err
,它将
长双精度
作为参数,并返回一个名为
Error
的结构。例如,
1.3\u err


此文本的
friend
声明放在头文件
TStat.h
中,定义放在
TStat.cpp
中,如下面的代码所示

但是,我在使用类似
b=0.4_err
的示例进行编译时出错,其中
b
error
。在错误中,它表示找不到文本运算符。您可以检查问题末尾的错误消息

我尝试了很多组合,比如定义内部或外部的文字等。我已经搜索了类似的问题,但是代码中的一切看起来都很好,就像很多教程和其他C++源描述的一样。 作为一名粒子物理学家,我使用一个由CERN开发的C/C++库,它实际上是一个C/C++解释器。在这里,我可以使用这个类而不会出现任何错误(我根本没有使用任何根类)。但是,当我使用

g++
c++11
标志编译代码时,找不到与文本匹配的内容

这是头文件:

#ifdef TSTAT_H
#define TSTAT_H

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

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

        friend Error operator "" _err (long double);
    }
}
这是TStat.cpp文件:

#包括“TStat.h”
使用名称空间TStat;
// ...
TStat::错误运算符“”\u err(长双错误){
TStat::错误;
// ...
返回误差;
}
在终端中使用以下命令编译时(我使用的是MacOS)

我听到一个错误说

example.cpp:6: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;
对于类似这样的example.cpp:

#include "TStat.h"

using namespace TStat;

int main() {
    Error b;
    b = 0.4_err;

    return 0;
}

friend
声明不会将声明的名称带入任何其他范围。在这种情况下,它甚至不将名称包含在类本身的范围内:

[class.friend]/7类中定义的友元函数位于定义它的类的(词法)范围内。类外定义的友元函数不是(6.4.1)

但这与所展示的案例无关
main
在任何类中都不会看到任何
friend
声明


最简单的修复方法是在任何类之外的顶层在
TStat.h
中声明
operator”“\u err

A
friend
声明不会将声明的名称带入任何其他范围。在这种情况下,它甚至不将名称包含在类本身的范围内:

[class.friend]/7类中定义的友元函数位于定义它的类的(词法)范围内。类外定义的友元函数不是(6.4.1)

但这与所展示的案例无关
main
在任何类中都不会看到任何
friend
声明


最简单的修复方法是在任何类之外的顶层声明
TStat.h
中的
operator”“\u err

没有行
b=0.4\u err在发布的代码中。请发布一个。我添加了example.cpp代码。谢谢没有行
b=0.4_错误在发布的代码中。请发布一个。我添加了example.cpp代码。谢谢哦,成功了!然而,当我试图定义以前工作的
TStat::Double操作符+(Double,TStat::error)
时,这会产生另一个错误。这是相关的还是我应该开始一个新问题?@OktayDoğangün我认为一个新问题会更好。S:我已经解决了那个问题(因为一个愚蠢的错误)。哦,它成功了!然而,当我试图定义以前工作的
TStat::Double操作符+(Double,TStat::error)
时,这会产生另一个错误。这是相关的还是我应该开始一个新问题?@OktayDoğangün我认为一个新问题会更好。S:我已经解决了这个问题(因为一个愚蠢的错误)。
#include "TStat.h"

using namespace TStat;

int main() {
    Error b;
    b = 0.4_err;

    return 0;
}