использование объявления с перечислением?

Вы имеете в виду, как это:

If Worksheets("MyData").Range("R2").Value2 = "yyy@gmail.com" Then
    .CC = "zzz@gmail.com; aaa@gmail.com"
Else
    .CC = "yyy@gmail.com; zzz@gmail.com; aaa@gmail.com"
End If
7
задан Aziz Shaikh 4 December 2015 в 12:06
поделиться

3 ответа

Класс не определяет пространство имен, поэтому "использование" не применимо здесь.

Кроме того, необходимо обнародовать перечисление.

При попытке использовать перечисление в том же классе, вот пример:

class Sample {
 public:
  enum Colour { RED, BLUE, GREEN };

  void foo();
}

void Sample::foo() {
  Colour foo = RED;
}

И получить доступ к нему извне класс:

void bar() {
  Sample::Colour colour = Sample::RED;
}
10
ответ дан 6 December 2019 в 07:52
поделиться

Для добавления к ответу Stevela проблема с исходным кодом состоит в том, что Вы обращаетесь к участнику, но объявление использования не является самостоятельно объявлением элемента:

7.3.3/6 имеет:

Объявление использования для участника класса должно быть объявлением элемента.

Для выделения этого следующий пример действительно работает:

class Sample
{
public:
  enum Colour { RED,BLUE,GREEN};
};

class Derived : public Sample
{
public:
  using Sample::Colour;  // OK
};

Наконец, как указано Igor Semenov здесь даже при перемещении перечислимого определения в пространство имен, таким образом, позволяя объявление использования, объявление использования только объявит название перечислимого типа в пространство имен (Стандартная ссылка 2003 года является 7.3.3/2).

namespace Sample
{
  enum Colour { RED,BLUE,GREEN};
}

using Sample::Colour;
using Sample::BLUE;


void foo ()
{
  int j = BLUE; // OK
  int i = RED;  // ERROR
}

Зависимые базовые типы

Для обеспечения частичных и явных специализаций когда компилятор анализирует шаблон класса, он не выполняет поисков в зависимых базовых классах. В результате следующее изменение с Образцом как шаблон не компилирует:

template <typename T>
class Sample
{
public:
  enum Colour { RED,BLUE,GREEN};
};

template <typename T>
class Derived : public Sample<T>
{
public:
  using Sample<T>::Colour;  // What kind of entity is Colour?

  Colour foo ()     // Not OK!
  {
  return this->RED;
  }
};

Проблема - это Derived::Colour рассматривается как объект компилятором (14.6/2):

Имя использовало в объявлении шаблона или определении, и это зависит от шаблонного параметра, как, предполагается, не называет тип, если применимый поиск имени не находит имя типа, или имя квалифицировано именем типа ключевого слова.

Рассмотрение этих двух условий для имени, чтобы быть типом:

  1. Поиск для Colour не находит тип потому что зависимая основа Sample<T> не ищется.
  2. Имя не квалифицировано typename

Для примера поэтому нужно typename ключевое слово:

template <typename T>
class Derived : public Sample<T>
{
public:
  using typename Sample<T>::Colour;  // Colour is treated as a typedef-name

  Colour foo ()  // OK
  {
  return this->RED;
  }
};

Примечание: '98 версий стандарта не позволили typename чтобы использоваться с объявлением использования и так фиксация вышеупомянутого не была возможна. Посмотрите типы Доступа от зависимых базовых классов и CWG11.

8
ответ дан 6 December 2019 в 07:52
поделиться

Стандарт C++, 7.3.3.1:

Имя элемента, указанное в объявлении использования, объявляется в декларативном регионе, в котором появляется объявление использования. [Отметьте: только указанное имя так объявляется; определение имени перечисления в объявлении использования не объявляет свои перечислители в декларативном регионе объявления использования. — заканчивают примечание]

5
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: