在我的类中无法识别用户定义的文本运算符
User-defined literal operator isn't recognised in my class
我编写了一个类,该类使用文字运算符来指示要在物理应用程序中使用的测量误差。我定义了一个文字""_err
,它将long double
作为参数并返回一个名为Error
的结构。例如,1.3_err
.
此文本的friend
声明放置在头文件TStat.h
中,定义放置在TStat.cpp
中,如下面的代码所示。
但是,在使用b = 0.4_err
b
Error
的示例进行编译时,我遇到了错误。在错误中,它说它找不到文字运算符。您可以在此问题末尾检查错误消息。
我尝试了许多组合,例如在内部或外部定义文字等。我已经搜索了类似的问题,但代码中的一切似乎都很好,就像许多教程和其他C++来源所描述的那样。
作为一名粒子物理学家,我使用由CERN开发的名为ROOT的C/C++库,它实际上是一个C/C++解释器。在那里,我可以毫无错误地使用这个类(我根本没有使用任何 ROOT 类(。但是,当我使用c++11
标志g++
编译代码时,找不到与文字匹配的内容。
这是头文件:
#ifdef TSTAT_H
#define TSTAT_H
namespace TStat {
struct Error {
// ...
}
class Double {
// constructors, etc.
// ...
friend Error operator "" _err (long double);
}
}
这是 TStat.cpp 文件:
#include "TStat.h"
using namespace TStat;
// ...
TStat::Error operator"" _err(long double err) {
TStat::Error error;
// ...
return error;
}
在终端中使用以下命令编译时(我正在使用MacOS(
g++ -Wall -g -std=c++11 example.cpp TStat.cpp -o example.exe
我收到一条错误消息,说
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;
举个例子.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 "" _err
。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- Visual C++(VS2017)中用户定义的转换不明确
- 使用用户定义的参数调用future/async并调用类方法
- 带有用户定义类的c++折叠表达式
- g++用户定义的动态链接库上的全局new和delete运算符
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 修改"std::set"中用户定义类型的值
- 参数包构造函数在类模板中隐藏用户定义的转换
- MAKE:找不到包含的用户定义的头文件?
- C++:用户定义的显式类型转换函数错误
- 是否有解决方法可以在 c++ 中为 short 定义用户定义的文字?
- 从 QAbstractItemModel 返回自定义用户类型
- 无法引用自定义用户控件
- Lua:为自定义用户数据提供一个字符串方法
- 是否可以在visualstudio调试窗口中定义用户定义的变量
- 如何在编写自定义用户操作时引用内置操作
- C++自定义用户输入调用变量
- 不能定义用户定义的字面值