相关疑难解决方法(0)

从依赖基类访问类型

有谁知道为什么使用声明似乎不适用于从依赖基类导入类型名称?它们适用于成员变量和函数,但至少在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++ templates dependent-name using-declaration

11
推荐指数
1
解决办法
3445
查看次数

C++命名空间'使用'声明用于类的枚举

我很好地理解了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)

c++ namespaces

10
推荐指数
2
解决办法
4134
查看次数

范围解析运算符枚举编译器特定的扩展?

这个问题上,有一个答案表明:

您可以使用typedef使Color枚举类型可访问,而不指定它的"全名".

typedef Sample::Colour Colour;
Colour c = Colour::BLUE;
Run Code Online (Sandbox Code Playgroud)

这听起来对我来说是正确的,但有人对它进行了投票并留下了这个评论:

在枚举上使用范围解析运算符::(在"Color :: BLUE"中)是特定于编译器的扩展,而不是标准C++

真的吗?我相信我已经在MSVC和GCC上都使用了它,尽管我不确定.

c++ standards

7
推荐指数
3
解决办法
4824
查看次数

类成员的使用声明应为成员声明 (C++2003)

第 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++

5
推荐指数
1
解决办法
1852
查看次数

在可能的类中使用C ++ 20中的“使用枚举”吗?

此答案中,提到了在即将到来的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

c++ enums enum-class c++20

3
推荐指数
1
解决办法
130
查看次数