Форум программистов, компьютерный форум 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. Я попыталась описать классы, вот что получилось. Помогите, пожалуйста, дописать, чтобы строились клетки. Я понимаю, что это делается как-то через функции... подробнее

Показать сообщение отдельно
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
11.10.2014, 03:05     Выбор шаблонного варианта для аргумента-массива
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему вызывается версия с указателем, а не с ссылкой!?
Если по-простому и на пальцах, то потому что T недостаточно квалифицирован для подстановки. В то время как перегрузка с указателем обеспечивает array-to-pointer conversion, которая одного ранга (Exact Match) с отсутствием какой-либо конверсии, а значит более предпочтительна (см. таблицу в 13.3.3.1.1).
Когда ты добавляешь const к варианту с указателем, то получаешь дополнительно qualification conversion. Перегрузка, требующая конверсии, теряет приоритет перед вариантом со ссылкой.
Чтобы получить нужное тебе поведение, надо в варианте со ссылкой квалифицировать T достаточным образом (тип массива в С++ представляет собой комбинацию типа и размерности):
C++
1
2
3
4
5
6
7
8
9
template <class T>
void func( T * t) {
    std::cout << "*" << sizeof(t) << std::endl;
}
 
template <class T>
void func( T (& t)[10]) {
    std::cout << "&" << sizeof(t) << std::endl;
}
Итого получаем ошибку неоднозначности, теперь перегрузки равны в глазах компилятора. Исправить это можно только вынеся размерность в аргумент шаблона, чтобы вариант начал рассматриваться исходя из подстановки, а не на общих основаниях.
C++
1
2
3
4
template <class T, size_t N>
void func( T (& t)[N]) {
    std::cout << "&" << sizeof(t) << std::endl;
}
Цитата Сообщение от IGPIGP Посмотреть сообщение
Туда где ожидается ссылка на тип можно передать переменную типа, но не указатель же?
Дело в том, что изначально массив не указатель и требует array-to-pointer conversion при передаче, так что вариант с T & может подойти, T разрешится в ссылку на массив. Но массив сложный тип и квалификации T недостаточно для выбора в нашем случае. В то время как преобразование к указателю имеет высокий приоритет, наравне с отсутствием преобразования.

Добавлено через 22 минуты
Как-то я главное не подчеркнул:
В данном случае, с использованием шаблонов помимо правил собственно перегрузки еще вступает в силу параграф 14.8.2. Т.е. сначала определяется, скажем так, степень выводимости шаблона (это не термин, если что), а потом уже правила перегрузки, поэтому-то и влияет так сильно уровень квалификации T. Компилятору не нужно выводить размерность массива, если мы ее указали явно. А в варианте с обычной ссылкой нужно вывести в T еще и размерность массива, поэтому наиболее простым вариантом остается array-to-pointer конвертация, которая, как я уже сказал, идентична по рангу отсутствию конвертации.
 
Текущее время: 19:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru