操作符++用于嵌套私有枚举-哪个编译器是正确的
Operator++ for nested private enum - which compiler is right?
基本上,我想要能够为Test enum定义操作符++,这是内部类的私有成员,这是外部类的私有成员。下面的代码片段可能有助于理解我想要实现的目标:
class Outer{
class Inner{
enum Test{ONE, TWO, THREE};
};
};
const Outer::Inner::Test& operator++(Outer::Inner::Test& test){
int rawTest = test;
test = static_cast<Outer::Inner::Test>(++rawTest);
return test;
}
不幸的是,上面将不会编译错误,测试是私有成员,所以接下来我尝试如下:
#include <iostream>
using namespace std;
class Outer{
class Inner{
enum Test{ONE, TWO, THREE};
friend const Test& operator++(Test& test);
};
friend const Inner::Test& operator++(Inner::Test& test);
};
const Outer::Inner::Test& operator++(Outer::Inner::Test& test){
int rawTest = test;
test = static_cast<Outer::Inner::Test>(++rawTest);
return test;
}
这仍然不起作用,因为Test是在私有的内部类中定义的,所以我必须将两个类放在一起,尽管它没有任何意义(我不想在外部类中访问Test enum)。只是为了能够在内部类中使用operator++)
当然我可以像这样让函数内联:
#include <iostream>
using namespace std;
class Outer{
class Inner{
enum Test{ONE, TWO, THREE};
friend const Test& operator++(Test& test){
int rawTest = test;
test = static_cast<Outer::Inner::Test>(++rawTest);
return test;
}
};
};
,但我可能不需要这个,因为假设有一些神奇的附加逻辑,我想在。cpp文件中有。我应该如何正确地声明操作符++才能对测试枚举进行操作?
编辑:这肯定不是给定问题的重复,因为我想简单地为嵌套类中的给定enum声明operator++。所提供的重复问题是关于从外部类函数访问内部类的成员。
编辑:下面是霍尔特的评论:实际上,clang接受你的第二段代码(带有两个友元声明),这将是标准的方式。我不知道这是clang扩展还是g++ bug…也许你应该重新提出你的问题,以引起周围语言律师的注意。"也许更合适的问题是,是否正确,gcc和msvc(我尝试过)不允许双重友谊代码,或者不,在我看来,c++标准应该在某种程度上允许在这样的情况下编写干净的代码(实际上不是那么复杂的情况)。
您要声明的是一个"全局"函数(operator++
),由于对Test
的访问,该函数仅在Outer::Inner
内部使用。我不知道这是否可能,但是一个简单的解决方法是回退到Inner
的静态方法:
#include <iostream>
class Outer{
class Inner{
enum Test{ONE, TWO, THREE};
static Test& pre_inc(Test&);
friend Test& operator++(Test& test) {
return pre_inc(test);
}
};
};
auto Outer::Inner::pre_inc(Test& test) -> Test& {
int rawTest = test;
test = static_cast<Test>(++rawTest);
return test;
}
相关文章:
- 用于捕获未赋值的 r 值的编译器选项
- RVO 何时保证应用/确实适用于 C++20 编译器
- 设置用于调试的 g++ 编译器标志
- 如何选择用于 GitHub 操作作业的 C/C++ 编译器?
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- 如何向 g++ 编译器解释如何读取用于从'list'文件中搜索 .h 文件的'include'目录列表
- 编译器将输出的流运算符<<解释为用于按位左移的二进制运算符<<
- 将编译器命令行转换为 CMakeLists.txt用于 Casablanca Rest SDK
- 用于引发字符串文本C++的编译器错误的宏
- C 编译器可以执行用于返回值的命名const变量的RVO
- 用于独立于系统的程序分发的即时C++编译器
- 编译器用于编译 128 位整数的基本算术运算的技巧
- Cmake:如何构建自定义编译器二进制文件,然后将其用于某些目标?
- 代码由编译器代替,用于成员功能的功能指针
- Calloc vs new 用于各种编译器中的复杂结构
- complex.h 适用于 Win32 目标以外的其他编译器,例如代码编辑器工作室 (CCS)
- VIM插件YouCompleteme用于使用SCON和G 编译器的项目
- 用于优化 QtCreator 编译器的配置
- 用于本地网络的联机c/c++编译器
- c++编译器用于win8(64位)