Описание тега dependent-name
Зависимое имя C++ - это имя, которое зависит от аргумента шаблона. Независимое имя не зависит от аргументов шаблона. Компилятор разрешает эти два типа имен в разные моменты времени.
1
ответ
Специализируясь только на вложенном шаблоне
У меня есть следующий шаблон: template<typename FirstParam> struct First { template<typename SecondParam> struct Second; }; Пример специализации: template<typename T> class D {}; template<> template<> struct First<C1…
25 сен '14 в 18:04
1
ответ
Использование переменных из родительского класса
Я пытался использовать шаблон для реализации стека. И мой вопрос, как я могу использовать переменные из родительского класса в этой ситуации? В этом случае моя ошибка компиляции: "top, a, size" не был объявлен в этой области. template<class T>…
21 дек '15 в 01:31
1
ответ
Где стандарт C++ 98 указывает, что локально объявленные имена шаблонов не зависят?
Согласно этой странице: http://womble.decadent.org.uk/c++/template-faq.html"Независимыми именами являются те имена, которые, как считается, не зависят от параметров шаблона, плюс имя самого шаблона и объявленных в нем имен (члены, друзья и локальные…
22 сен '12 в 12:52
1
ответ
Метод, который обращается к условному члену класса, не компилируется только при вызове
Я написал следующий класс, который имеет условный член _s а также worksOnlyForString метод, который обращается к члену как std::string, если worksOnlyForString метод не вызывается, код компилируется, даже если член не std::string, Существует хорошо …
25 окт '18 в 13:32
3
ответа
Почему `this` является зависимым от типа выражением, даже если класс шаблона не имеет базового класса?
Следующий код может быть скомпилирован без ошибок: template <typename T> struct A { void f() { this->whatever; } // whatever is not declared before }; int main() { A<int> a; } И я знаю, что это потому, что this является зависимым от т…
30 авг '16 в 04:37
1
ответ
Вложенные классы являются зависимыми типами в шаблонах классов?
Учтите следующее: template<class> struct T { struct T1 { struct T2 { }; }; /*typename*/ T1::T2 m; }; Без typename, компиляция не удалась, так как T2 считается зависимым именем и, следовательно, не типом. Посмотрев на проект стандарта C++17 (N4…
29 июн '18 в 16:32
1
ответ
Это ошибка в зависимом разрешении имен в MSVC?
На cppreference.com в качестве примера представлен следующий код, объясняющий разрешение зависимых имен: #include <iostream> void g(double) { std::cout << "g(double)\n"; } template<class T> struct S { void f() const { g(1); // "g" …
08 июн '16 в 12:59
2
ответа
Ключевое слово typename и спецификатор вложенного имени
struct A{}; template <typename T> struct B { typename ::A a1; //(1) typename A a2; //(2): error }; int main(){return 0;} Почему первый случай правильный, а второй нет? Я не понимаю смысл этого ограничения.И вообще, почему разрешен первый случа…
06 янв '15 в 12:16
1
ответ
Ошибка компилятора при использовании целого числа в качестве параметра шаблона
Что не так со следующим фрагментом кода? template<typename X> struct A { template<int N> int foo() const { return N; } }; template<typename X> struct B { int bar(const A<X>& v) { return v.foo<13>(); } }; #include &l…
11 сен '10 в 14:51
2
ответа
Почему я не могу использовать QList::size_type, как я бы использовал std::string::size_type? (ошибка параметра шаблона)
При исследовании предупреждения сравнения целых чисел без знака и со знаком при объявлении итератора в цикле for я прочитал это: По возможности используйте точный тип, с которым вы будете сравнивать (например, используйте std::string::size_type при …
22 июн '17 в 14:08
2
ответа
Специализирующая функция-член для не шаблонного класса в C++
Я пытаюсь специализировать функцию-член шаблона не-шаблонного класса, используя шаблонный параметр: #include <array> class C { public: template<class Container> void Foo( Container& ) { // ... } }; template<class T, std::size_t N&…
20 май '11 в 19:53
1
ответ
Почему зависимое имя может считаться полным, даже если фактический тип не определен до самого конца
Рассмотрим этот пример: template <class T> void Yeap(T); int main() { Yeap(0); return 0; } template <class T> void YeapImpl(); struct X; template <class T> void Yeap(T) { YeapImpl<X>(); // pass X to another template } templa…
18 сен '18 в 14:30
1
ответ
Базовый класс шаблона typedef члены невидимые
Мне известно о том, что "зависимые имена" не видны компилятору по умолчанию. Но мне было сказано в ответах на другие вопросы SO ( здесь, здесь и, в конечном счете, на C++ faq), что using Декларация может помочь. Итак, я попробовал. Базовый класс шаб…
15 ноя '12 в 20:33
2
ответа
Различия в поиске имен между g++ и MSVS
Рассмотрим этот код: #include <iostream> namespace N { class A {}; void f(A a) { std::cout << "N::f\n"; } } void f(int i) { std::cout << "::f\n"; } template <typename T> class Base { public: void f(T x) { std::cout << "…
30 авг '16 в 12:51
1
ответ
Требуется ли указывать для зависимого имени typename, если оно используется в качестве аргумента шаблона?
template<class mapT, class K, class V> void f(mapT& m, const K& k, const V& v) { pair<mapT::iterator, bool> p = m.insert(make_pair(k, v)); } MSVC принимает этот код без ошибок и предупреждений. Что стандарт должен сказать по …
11 июн '14 в 09:09
2
ответа
Компилятор Visual C++ допускает использование зависимого имени как типа без "typename"?
Сегодня один из моих друзей сказал мне, что следующий код хорошо компилируется в его Visual Studio 2008: #include <vector> struct A { static int const const_iterator = 100; }; int i; template <typename T> void PrintAll(const T & obj)…
04 июн '10 в 13:59
5
ответов
Несколько вложенных зависимых имен - куда вставлять ключевое слово typename?
Этот вопрос был вдохновлен другим вопросом. Пытаясь ответить на этот вопрос, я поняла, что у меня много вопросов. Итак... Рассмотрим следующее: struct S1 { enum { value = 42 }; }; template <class T> struct S2 { typedef S1 Type; }; template <…
10 июл '11 в 17:42
1
ответ
Лучшее совпадение не найдено ADL после момента создания. Это UB?
Рассмотрим следующий код, в котором расположение перегрузок f вызывает некоторое неинтуитивное поведение. Код компилируется без предупреждений как в Clang 3.4.1, так и в gcc 4.8. template<typename T> struct A { static const int value = sizeof(…
06 ноя '14 в 22:45
1
ответ
Оператор сравнения для std::vector<T> не может найти оператор сравнения для T
Следующий очень простой код не скомпилируется #include <vector> #include <string> namespace Foobar { struct Test { std::string f; std::uint16_t uuid; }; } bool operator==(const Foobar::Test& lhs, const Foobar::Test& rhs){ return …
20 июл '18 в 17:44
1
ответ
Зависимые типы с вариационными шаблонами
Можете ли вы увидеть что-то не так с этим объявлением функции? template<typename... Containers> std::tuple<typename Containers::value_type...> foo(const Containers &...args); Когда я пытаюсь это назвать, вот так: foo(std::list<int…
06 фев '14 в 15:33