Форум программистов, компьютерный форум CyberForum.ru

Выбор шаблонного варианта для аргумента-массива - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка "Недопустимый else без парного if" http://www.cyberforum.ru/cpp/thread1273030.html
#include <iostream> #include <stdio.h> using namespace std; // ВЫВОД МАТРИЦЫ НА ЭКРАН void print(int **Q, int x, int y) { int i, j; for (i = 0; i<x; i++)
C++ Unexpected() не вызывается Всем привет! Читаю бессмертный труд Страуструпа Язык программирования С++издания 2011 года (п.14.6 о спецификации исключений): Если во время своего выполнения она (функция со спецификацией исключений) попробует произвести действия, нарушающие объявленную гарантию, такая попытка приведет к вызову стандартной функции std::unexpected (). По умолчанию, функция std::unexpected() вызывает... http://www.cyberforum.ru/cpp/thread1273018.html
Разделить функцию на две C++
Выполнил контрольную. Все работает как надо. Но потом заметил, что пропустил в условии "минимум 2 функции". Помогите без потерь переместить кусок кода из 1 функции в другую. Желательно тот кусок, который "//вычисляю строку по убыванию и записываю ее номер". #include <stdio.h> int dop(int,int,int,int); #define nn 20 int main() { int mas,l,h,i,j,k,s;
C++ Найти среднее арифметическое массива
Для B найти среднее арифметическое подсказка: S2(вещественное)=sum(целое)/n 1) сделать sum вещ. 2) s2=1.+sum/n 3)s2=float(sum)/n
C++ Перевод из 6-ричной системы в десятичную http://www.cyberforum.ru/cpp/thread1272994.html
На вход программе подается строка символов, оканчивающаяся точкой, и состоящая из ненулевого количества неотрицательных целых чисел, записанных в 6-ричной системе счисления. Каждые 2 соседних числа разделены непустой последовательность пробелов и/или :. Каждое число состоит не более, чем из 5-ти разрядов, ведущие нули и знак + не используется. Общая длина строки, включая точку, не должна...
C++ Создание шахматного поля Добрый вечер. Я пытаюсь написать простую игру шахматы в ООП, с графикой. Начала с создание доски и описания классов: поле(field) и клетки черные и белые(cell). Я не очень понимаю как использовать графику. Хочу создать поле как массив клеток 8х8. Я попыталась описать классы, вот что получилось. Помогите, пожалуйста, дописать, чтобы строились клетки. Я понимаю, что это делается как-то через функции... подробнее

Показать сообщение отдельно
IGPIGP
Комп_Оратор)
6366 / 3013 / 297
Регистрация: 04.12.2011
Сообщений: 8,102
Записей в блоге: 3
12.10.2014, 03:46     Выбор шаблонного варианта для аргумента-массива
Цитата Сообщение от DrOffset Посмотреть сообщение
В общем я не знаю как еще объяснять
Я понимаю, что ты говоришь, - массив это тип и передать его можно по ссылке T& где T - абстрактный тип. Мой компилятор против. А у меня логика, которая тоже против. Ссылка на массив имеет отдельный синтаксис и typedef ничего не объясняет. Он то подставит именно правильное объявление и по форме (синтаксически) и по содержанию, - с размером массива то есть. Это же компилтайм трюк. Вот когда ты сказал:
Цитата Сообщение от DrOffset Посмотреть сообщение
тип массива в С++ представляет собой комбинацию типа и размерности
Цитата Сообщение от DrOffset Посмотреть сообщение
Но массив сложный тип и квалификации T недостаточно для выбора в нашем случае.
Мне и захотелось сказать: "И..." То есть правильно же. У массива есть синтаксис определения ссылки и там вся необходимая информация, как и должно быть. Поэтому к ссылке на тип и не приводится. Но возник спор. Не стану упорствовать.

Добавлено через 59 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не стану упорствовать.
Эт я погорячился. Как и со всем остальным. Признаю что неправ. Только-что сделал вот что: оставил определение шаблона:
C++
1
2
3
4
template <typename T>
void foo(T& t){
cout << "&" << sizeof(t)/sizeof(t[0])<<endl;
}
в одиночестве. И компилятор стал передавать имя массива по ссылке на него! И это значит, что ты прав и когда они в паре с шаблоном для T* то последний побеждает потому, что его проще вывести...
Тогда непонятно, почему нет неоднозначности? Такое ощущение, что компилятор не видит шаблон с T& когда есть вариант с T*. А ведь оба вызываются одинаково.
Удивление усиливает то, что если оставить такие два:
C++
1
2
3
4
5
6
7
8
template <typename T, size_t N>
void foo(T (&t)[N]) {
cout << "T (&t)[N] with N= " << sizeof(t)/sizeof(T)<<endl;
}
template <typename T>
void foo(T* t){
cout << "*" << sizeof(t)<<endl;
}
то компилируется только если закоментировать вызов foo(a); , а иначе неоднозначный вызов! Почему же Т* и T& уживаются, а T* и T (&t)[N] нет? Я потому и решил сначала, что T& не в тему и тогда есть логика, как мне казалось. Оказывается если "дожать" и оставить T& в одиночестве, - Ok! Пусть T* "легчевыводимее" T&, почему они не дерутся, в то время когда одновременно определённые T* и T (&t)[N] не переносят вызов по имени массива? Не уж-то ссылка T (&t)[N] борется с T* за имя массива уже преобразованное к указателю? Кем и зачем? Не понимаю.
Так или иначе, а я оказался неправ. Приношу извинения.
 
Текущее время: 05:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru