有谁知道为什么使用声明似乎不适用于从依赖基类导入类型名称?它们适用于成员变量和函数,但至少在GCC 4.3中,它们似乎被忽略了类型.
template <class T>
struct Base
{
typedef T value_type;
};
template <class T>
struct Derived : Base<T>
{
// Version 1: error on conforming compilers
value_type get();
// Version 2: OK, but unwieldy for repeated references
typename Base<T>::value_type get();
// Version 3: OK, but unwieldy for many types or deep inheritance
typedef typename Base<T>::value_type value_type;
value_type get();
// Version 4: why doesn't this work?
using typename Base<T>::value_type;
value_type get(); // GCC: `value_type' is not a type
};
Run Code Online (Sandbox Code Playgroud)
我有一个基类,有一组allocator样式的typedef,我想在几个继承级别继承.到目前为止,我发现的最佳解决方案是上面的版本3,但我很好奇为什么版本4似乎不起作用.GCC接受使用声明,但似乎忽略它. …
我很好地理解了C++"使用"声明和指令是如何工作的.但是,我对此感到难过......也许这不可能?我想避免质量我的枚举变量:
namespace Foo {
class MyClass {
public:
enum MyEnum { X, Y, Z };
}
}
Run Code Online (Sandbox Code Playgroud)
现在,从该命名空间外部,我希望能够做到这样的事情:
using Foo::MyClass.MyEnum;
MyEnum letter = MyEnum::x;
Run Code Online (Sandbox Code Playgroud)
但显然那不是这样做的方法吗?我打赌这是可能的,但我的符号是错误的...我也尝试使用Foo :: MyClass :: MyEnum,但编译器认为Foo :: MyClass是一个命名空间.
补充:正如你所看到的,完全宣布一切都变得很烦人......
Foo::MyClass::MyEnum value = Foo::MyClass::X;
Run Code Online (Sandbox Code Playgroud) 您可以使用typedef使Color枚举类型可访问,而不指定它的"全名".
Run Code Online (Sandbox Code Playgroud)typedef Sample::Colour Colour; Colour c = Colour::BLUE;
这听起来对我来说是正确的,但有人对它进行了投票并留下了这个评论:
在枚举上使用范围解析运算符::(在"Color :: BLUE"中)是特定于编译器的扩展,而不是标准C++
真的吗?我相信我已经在MSVC和GCC上都使用了它,尽管我不确定.
第 7.3.3 段。C++2003 标准指出
类成员的使用声明应为成员声明。
这意味着以下给出了语法错误:
struct S1
{
static int var1;
};
using S1::var1;
Run Code Online (Sandbox Code Playgroud)
虽然以下编译良好:
namespace N2
{
int var2;
}
using N2::var2;
Run Code Online (Sandbox Code Playgroud)
有人知道其背后的理由(如果有的话)吗?
更重要的是,该标准给出了结构体静态数据成员的明确示例,并告诉它应该导致语法错误。MS C++ 给出此错误:
cpptest1.cxx(9) :错误 C2885:'S1::var1':不是非类范围内的有效使用声明
目前尚不清楚为什么要禁止这种做法。
在此答案中,提到了在即将到来的C ++ 20标准中可以使用usingon语句,enum class并将枚举字段导入本地名称空间。
我想知道这是否还意味着我也可以在这样的类定义中使用它:
class Foo {
enum class Color
{
red,
blue
};
using enum Color;
};
int main()
{
Foo::Color c = Foo::red;
}
Run Code Online (Sandbox Code Playgroud)
还是我仍然需要提供完整的名称空间?:
Foo::Color c = Foo::Color::red;
Run Code Online (Sandbox Code Playgroud)
我在wandbox.org中尝试过,但似乎gcc和clang都不知道using enum。