Описание тега using-declaration

Используйте этот тег для вопросов, связанных с ключевым словом using в C++.
1 ответ

Зачем нужна декларация об использовании именования конструктора?

Оба параграфа, 7.3.3.p1 и p3 в Стандарте C++11, ссылаются на объявление об использовании, именующее конструктор. Почему это необходимо? Код ниже показывает, что базовый класс A конструкторы видны в производном классе B как и ожидалось. class A { int…
08 июл '13 в 17:21
0 ответов

Есть ли обходной путь для расширения пакета параметров при использовании объявлений

Расширение пакета параметров при использовании объявлений не поддерживается в C++ 14, поэтому следующий код не компилируется: template<typename T> struct A { virtual void foo(T); }; template<typename... T> struct B: public A<T>...…
22 дек '15 в 15:05
3 ответа

Должно ли объявление использования скрывать унаследованную виртуальную функцию?

struct level0 { virtual void foo() = 0; }; struct level1 : level0 { virtual void foo() { cout <<" level1 " << endl; } }; struct level2 : level1 { virtual void foo() { cout <<" level2 " << endl; } }; struct level3 : level2 { u…
12 янв '11 в 13:53
2 ответа

Почему использование не может быть использовано для определения виртуальной функции?

Я недавно обнаружил использование using импортировать функцию базового класса в пространство имен производного класса (когда он скрыт). Я пытался использовать его для импорта функции из базового класса в качестве реализации функции в производном кла…
1 ответ

Импортирует ли объявление об использовании только перегрузки, объявленные выше объявления об использовании?

Например, GCC и clang не могут скомпилировать следующий код: struct S {}; namespace N { void g(S); } using N::g; namespace N { void g(int); } int main() { g(0); } с ошибкой: test.cpp: In function 'int main()': test.cpp:17:8: error: could not convert…
1 ответ

Объявление использования не может повторяться в области действия функции. Это почему?

В [namespace.udecl]/10 у вас есть следующий пример: namespace A { int i; } namespace A1 { using A::i; using A::i; // OK: double declaration } void f() { using A::i; using A::i; // error: double declaration } Этот фрагмент компилируется в лязг.
04 июл '15 в 14:54
2 ответа

Почему в реализации функции-члена тип результата не может быть описан с помощью определения в классе?

Реорганизовав некоторый код, я обнаружил, что если у меня есть определение функции-члена вне класса, его возвращаемый тип не может использовать имена, определенные с помощью "using" внутри этого класса. #include <iostream> class Foo { public: …
27 ноя '18 в 00:47
1 ответ

Использование декларации (производный класс)

struct B1{ int d; void fb(){}; }; struct B2 : B1{ using B1::d; using B1::fb; int d; // why this gives error? void fb(){} // and this does not? }; int main(){} Это потому что B1::fb() рассматривается как B1::fb(B1*) and B2::fb() рассматриваемый как B…
23 авг '10 в 04:48
2 ответа

Способ использовать все неквалифицированные имена в классе перечисления C++0x?

Новый C++ (C++0x или C++11) имеет новый тип enum, "enum class", где имена ограничиваются перечислением (среди прочего). enum class E { VAL1, VAL2 }; void fun() { E e = E::VAL1; // Qualified name } Мне интересно, однако, могу ли я выборочно использов…
17 сен '11 в 18:53
1 ответ

Вызов объявленного псевдонимом конструктора базового класса в другом пространстве имен

Я пытаюсь понять некоторые детали объявленных псевдонимами классов через C++11 using и как / почему это влияет на вызов конструктора базового класса. Пример кода #include <iostream> namespace N { template<typename T> struct Foo { // Foo(…
4 ответа

C++ с использованием ключевого слова

В чем разница между этими двумя using ключевое слово: using boost::shared_ptr; а также using namespace boost;
07 авг '11 в 13:43
3 ответа

В C++ можно переименовать / псевдоним не пространство имен, имя не класса?

Я имею namespace src { struct src_bar; void src_baz(); template<class T> class src_qux; } который я хотел бы сослаться на namespace dst { struct dst_bar; void dst_baz(); template<class T> class dst_qux; } Это означает, что я хотел бы "пе…
01 фев '12 в 04:15
3 ответа

Использование объявлений и константных перегрузок

Предположим, у меня есть две версии operator-> (перегружен на const) в базовом классе. Если я говорю using Base::operator->; в производном классе я получу доступ к обеим версиям или только к неконстантной?
2 ответа

Наследование родительского оператора присваивания при неявном удалении потомка

В GCC 4.6 возможно наследовать операторы присваивания родителя, даже если дочерние операторы присваивания неявно удалены из-за конструктора перемещения. В более поздних версиях GCC (а также Clang) это больше невозможно. Как правильно, чтобы дочерний…
01 апр '13 в 21:58
0 ответов

IntelliSense: переопределение шаблона псевдонима

IntelliSense в Visual Studio 2017 (15.1) подчеркивает слово Type в следующем коде: #include <type_traits> template<class... Vars> struct Test : std::true_type { }; template<class... TT> using Type /*!*/ = std::conditional_t<std:…
12 май '17 в 14:24
0 ответов

Visual Studio 2015 ошибка? Неоднозначный доступ к функциям-членам, порядок переопределения классов предков с помощью оператора

Я что-то упустил или обнаружил ошибку в Visual Studio? Ошибки в стороне, использование этого типа наследства - ОК или зло? GCC 4.9.0 дает мои ожидаемые результаты: base.getProperty() 1 otherBase.getProperty() 2 derivedA.getProperty() 1 derivedB.getP…
2 ответа

Почему конструктор перемещения не используется при объявлении

В следующем коде конструктор перемещения производного класса, очевидно, не генерируется, хотя базовый класс является конструируемым перемещением. #include <cstddef> #include <memory> #include <cstring> #include <cassert> temp…
25 дек '17 в 12:30
1 ответ

Использование объявления содержит нерасширенный пакет параметров

Как мне получить этот код для компиляции? struct type1 {}; struct type2 {}; struct handler1 { void handle(type1){} }; struct handler2 { void handle(type2){} }; template <typename... Handlers> struct TheHandler : Handlers... { using Handlers::h…
1 ответ

Что не так с этим использованием шаблона `using` декларации

Что не так со следующим использованием шаблона using декларация? template <typename T1, typename T2> struct A { template <typename AnotherT1> using MyTemplate = A<AnotherT1, T2>; }; template<class SomeA> struct B { using MyTy…
03 апр '16 в 14:39
1 ответ

using-объявление в производном классе не скрывает ту же функцию, производную от базового класса

Посмотрите на следующий код: struct A { public: virtual void f(){std::cout << "in A";}; }; struct B : A{ public: virtual void f(){std::cout << "in B";}; int a; }; struct C : B{ using A::f; void test(){f();} }; int main() { C c; c.f(); //…
11 фев '15 в 08:03