Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 07.02.2021
Сообщений: 11
1

Подскажите, что происходит во второй строке кода

10.02.2021, 17:08. Показов 1178. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем привет,
подскажите пожалуйста что происходит во второй строке кода:

C++
1
2
template < typename A> struct BL { typedef A CL; } ;
template < typename D>  struct BL<D>:: CL E();
Заранее Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2021, 17:08
Ответы с готовыми решениями:

Объясните, что происходит во второй строке цикла
Объясните, пожалуйста, подробно, как работает вторая строка. {for (int i = 0; i&lt;n; i++) // Цикл....

Что происходит в строке кода
Всем привет. В буфере хранится путь, я нахожу последнюю точку и зануляю (конец строки). buffer...

Подскажите пожалуйста, что в этом куске кода происходит ?
Windows Forms, компонент vlc требует директорию, генератор формы нарисовал вот такой код....

Дать развернутые комментарии к каждой строке этого кода. Что вообще в каждой строке происходит
clc; clear; sizeX = input('Введите кол-во строк: '); sizeY = input('Введите кол-во столбцов: ');...

5
2105 / 1192 / 496
Регистрация: 11.10.2018
Сообщений: 6,000
10.02.2021, 17:24 2
А зачем typedef в первой строке писать?
0
2834 / 2336 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
11.02.2021, 01:01 3
Цитата Сообщение от FFPowerMan Посмотреть сообщение
А зачем typedef в первой строке писать?
просто внутри структуры объявление псевдонима типу, ничего необычного.

Цитата Сообщение от wertoz Посмотреть сообщение
подскажите пожалуйста что происходит во второй строке кода:
объявляется шаблонная функция с именем E возвращающая BL<D>::CL

Добавлено через 11 минут
Цитата Сообщение от wertoz Посмотреть сообщение
подскажите пожалуйста что происходит во второй строке кода:
но там вместо struct , должно быть typename .

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
template < typename A> struct BL { typedef A CL; } ;
template < typename D>  typename BL<D>::CL E();
 
template < typename D>  typename BL<D>::CL E()
{
    return (typename BL<D>::CL){};
}
 
int main()
{
    auto obl = E<int>();
    std::cout << "Hello, world!\n";
}
Добавлено через 1 час 22 минуты
может быть и struct/class, тогда накладываются какие то ограничения на тип class BL<D>::CL
что то про ‘BL<int>::CL {aka int}’, which is is not a class type
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
template < typename A> struct BL { typedef A CL; } ;
template < typename D>  struct BL<D>::CL E();
 
template < typename D>  struct BL<D>::CL E()
{
 
    return typename BL<D>::CL();
}
 
int main()
{
    //auto obi = E<int>(); // error при struct BL<D>::CL E()
    auto obs = E<std::string>();
    std::cout << "Hello, world!\n";
}
интересно как ...
1
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
11.02.2021, 01:28 4
Лучший ответ Сообщение было отмечено wertoz как решение

Решение

Цитата Сообщение от wertoz Посмотреть сообщение
подскажите пожалуйста что происходит во второй строке кода:

C++
1
2
template < typename A> struct BL { typedef A CL; } ;
template < typename D>  struct BL<D>:: CL E();
Объявляется шаблон функции E. При этом тип возвращаемого значения указан как struct BL<D>::CL.

Так как тип возвращаемого значения в этой функции явно указан с ключевым словом struct, корректным такой способ указания типа возвращаемого значения получится только в том случае, когда BL<D>::CL является класс-типом. (В противном случае получится substitution failure. Это будет не "жесткая ошибка", а просто ошибка подстановки, как в SFINAE.)

Например, корректная подстановка

C++
1
2
3
4
5
6
7
8
9
template <typename A> struct BL { typedef A CL; };
template <typename D> struct BL<D>::CL E() {}
 
struct S {};
 
int main()
{
  E<S>();
}
Или например так

C++
1
2
3
4
5
6
7
8
9
template <typename A> struct BL { typedef A CL; };
template <typename D> struct BL<D>::CL E() {}
 
template <> struct BL<int> { struct CL {}; } ;
 
int main()
{
  E<int>();
}
Однако в обоих случаях в этой функции не хватает return.

Добавлено через 6 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
но там вместо struct , должно быть typename .
Если явно указано struct, то не нужно (и нельзя) указывать typename.

Добавлено через 13 минут
---

Пользуясь таким приемом через SFINАE можно, например, написать отличалку класс типов от не-класс типов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
template <typename T> struct Helper
{
  using type = T;
};
 
template <typename T, unsigned = sizeof(T *)> struct is_class_type
{ 
  static constexpr bool value = false;
};
 
template <typename T> struct is_class_type<T, sizeof(struct Helper<T>::type *)> 
{ 
  static constexpr bool value = true;
};
 
class X;
union Y;
 
int main()
{
  std::cout << is_class_type<int>::value << std::endl;
  std::cout << is_class_type<X>::value << std::endl;
  std::cout << is_class_type<Y>::value << std::endl;
}
2
2834 / 2336 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
11.02.2021, 01:33 5
TheCalligrapher, для проверки на встроенные типы есть же готовая конструкция
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
11.02.2021, 01:48 6
Цитата Сообщение от SmallEvil Посмотреть сообщение
для проверки на встроенные типы есть же готовая конструкция
Это прекрасно. Я не предлагаю никому заменять готовые конструкции. Я лишь привел пример того, что использование struct с вложенным зависимым типом не является жесткой ошибкой, а просто генерирует substitution failure.
1
11.02.2021, 01:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2021, 01:48
Помогаю со студенческими работами здесь

подскажите пожалуйста что происходит в этой строке (ClientSocket1.Socket.SendText)
procedure TForm1.btn1Click(Sender: TObject); var Size: integer; ...

Удалить лишние пробелы в строке (подскажите, что происходит в конкретной строчке)
Программа ввода строки с клавиатуры и удаления лишних пробелов. Подскажите, пожалуйста, что...

Подскажите понять логику данного кода, начиная со строки фор, что на каждой строке выполняется
#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; #define N 40 using namespace std;...

В этой части кода происходит объявление функций? Что такое void? Что в скобках?
В этой части кода происходит объявление функций? Что такое void? Что в скобках? void get(float...

Нужно описание исходного кода скринсейвера, т.е. где что происходит, что чему и для чего присваивается и т.д
unit unitMain; interface uses Windows, Classes, Graphics, Forms, Registry; type ...

Что происходит в куске кода?
Есть класс class Figure { public: virtual ~Figure() {} //деструктор класса virtual void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru