powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Многомерные массивы в качестве параметров шаблонной функции
9 сообщений из 9, страница 1 из 1
Многомерные массивы в качестве параметров шаблонной функции
    #39650222
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть массив, двумерный. Например, квадратный.
Код: plaintext
1.
	int  a1[2][2] = { {1, 2}, {3, 4} };


С помощью функции aShow() можно вывести поэлементно:

aShow() - ОК
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void aShow(int array1 [2][2])
{
	cout << endl << 2 << "x" << 2 << endl << "===" << endl;
	for (int i = 0; i < 2; ++i)
	{
		cout << i << ": ";
		for (int j = 0; j < 2; ++j)
			cout << '\t' << array1[i][j];
		cout << endl;
	}
}
...
int main()
{
	int  a1[2][2] = { {1, 2}, {3, 4} };
	aShow(a1);



Понятно.
...
Пытаюсь построить шаблонную функцию tShow1() - аналог aShow(), не работает:
tShow1() - не компилируется
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void tShow1(typeOfItem array1 [order][order])
{
	cout << endl << order << "x" << order << endl << "===" << endl;
	for (int i = 0; i < order; ++i)
	{
		cout << i << ": ";
		for (int j = 0; j < order; ++j)
			cout << '\t' << array1[i][j];
		cout << endl;
	}
}
int main()
{
	int  a1[2][2] = { {1, 2}, {3, 4} };
	tShow1(a1);// Ошибка при компиляции: 
// error C2672: "tShow1": не найдена соответствующая перегруженная функция
// error C2784: void tShow1(typeOfItem [order][order]): не удалось вывести аргумент шаблон 
//                                                      для "typeOfItem [order][order]" из "int [2][2]"




Почитал, поискал. Нашел, создал шаблонную функцию tShow2(), все ОК:
tShow2 - OK
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
template <typename typeOfItem, int order>
void tShow2(typeOfItem(&array1)[order][order])
{
	cout << endl << order << "x" << order << endl << "===" << endl;
	for (int i = 0; i < order; ++i)
	{
		cout << i << ": ";
		for (int j = 0; j < order; ++j)
			cout << '\t' << array1[i][j];
		cout << endl;
	}
}


int main()
{
	int  a1[2][2] = { {1, 2}, {3, 4} };
	tShow2(a1); // ОК




Почему "в шаблоне" одна компилируется, а вторая - нет?
Вроде бы нерабочий шаблонный вариант соответствует рабочему не-шаблонному.
Поясните, пожалуйста.


Код: plaintext
1.
2.
void tShow1(typeOfItem array1 [order][order]); // Плохо
void tShow2(typeOfItem(&array1)[order][order]); // Хорошо


Обращение к обеим функциям одинаковое:

Код: plaintext
1.
2.
3.
	int  a1[2][2] = { {1, 2}, {3, 4} };
	tShow1(a1);
	tShow2(a1);


...
Что-то нашел про многомерные массивы как аргументы функций, а вот как их использовать при создании шаблонных функций - не нашел, только примеры.

Пожалуйста, объясните разницу или дайте ссылку, где почитать. Спасибо.
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39650224
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gcc и clang компилируют.
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39650227
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче, всё сложно с `typeOfItem array1 [order][order]`

С аргументом всё просто (P — тип параметра, A — тип аргумента):
http://eel.is/c draft/temp.deduct.call#2.1If P is not a reference type:
— If A is an array type, the pointer type produced by the array-to-pointer standard conversion is used in place of A for type deduction
Т.е. тип аргумента из `int[2][2]` превращается в `int(*)[2]`.

А вот что делать с типом параметра — не ясно. Есть 2 открытых DR-а: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1001 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1322

Вроде решили, что тип параметра преобразуется как сказано в http://eel.is/c draft/dcl.fct#5 (массив превращается в указатель) ещё в шаблоне функции. Но решили не то, чтобы совсем.

gcc и clang идут путём преобразования параметра ещё в шаблоне функции и поэтому параметр преобразуется в `typeOfItem array1(*)[order]`, что удачно матчит `int(*)[2]`.
MSVC, видимо, оставляет параметр в шаблоне не преобразованным и ожидаемо не может вывести из `int(*)[2]` тип `typeOfItem [order][order]`
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39650228
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a guestMSVC, видимо, оставляет параметр в шаблоне не преобразованнымЧто, конечно, ожидаемо, т.к. MSVC не умеет в полноценные шаблоны и относится к ним примерно как к макросам: не пытается толком парсить в момент чтения определения шаблона и различать в нём dependent и не-dependent типы.
Соответственно, и преобразовывать типы параметров шаблона функции не умеет.
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39650351
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest,

Т.е., особенности реализации компиляторов, в итоге используется вариант, работающий "и там и тут".
Спасибо за ссылки.
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39651045
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestотносится к ним примерно как к макросам: не пытается толком парсить в момент чтения определения шаблона и различать в нём dependent и не-dependent типы.

Не парсить -- это вполне согласующаяся со стандартом модель поведения.

А то, что ADL VC долго не умела, и только вроде бы совсем недавно в 2017-ой кое как запилили -- давно известно.
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39651350
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivНе парсить -- это вполне согласующаяся со стандартом модель поведения.Нет.
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39653388
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestMasterZivНе парсить -- это вполне согласующаяся со стандартом модель поведения.Нет.

Ну, давай докажи, со ссылками на ISO...
...
Рейтинг: 0 / 0
Многомерные массивы в качестве параметров шаблонной функции
    #39653398
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiva guestпропущено...
Нет.

Ну, давай докажи, со ссылками на ISO...Учат в школе или в ВУЗе. Сейчас ты должен уметь сам добывать знания.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Многомерные массивы в качестве параметров шаблонной функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]