Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 2

Необъявленный идентификатор в шаблоне функции

18.04.2017, 21:13. Показов 3479. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Пишу простенькую программку, но возникла проблема в коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
template <typename T>
T maxn(const T array[arrS], int arrS)
{
    T max = array[0];
    for (int i = 1; i < arrS; i++)
        if (m[i] > max)
            max = m[i];
    return max; 
}
Почему компилятор утверждает: "arrS: необъявленный идентификатор"?
При этом, если arrS поменять на count, то компилятор перестает возмущаться.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2017, 21:13
Ответы с готовыми решениями:

Ошибка в объявлении функции (необъявленный идентификатор)
#pragma once #include &lt;cstring&gt; typedef unsigned int ui; int GetNumberInt(); double GetNumberFloat(); bool GetBool(); void...

необъявленный идентификатор
Код функции: void Logic(){ int prevX = tailX; //хвост int prevY = tailY; int prev2X, prev2Y; for(i = 1; i &lt; nTail; i++){ ...

Необъявленный идентификатор j
Нужно сформировать квадратную матрицу вида: 1 2 ...... n n n-1 ..... 1 1 2 ...... n n n-1 ..... 1 ............... ...

21
Модератор
Эксперт С++
 Аватар для zss
13781 / 10974 / 6491
Регистрация: 18.12.2011
Сообщений: 29,259
18.04.2017, 21:15
C++
1
T maxn(const T array[], int arrS)
И можете еще сделать так
C++
1
2
3
4
5
6
7
8
9
template <typename T,int arrS>
T maxn(const T array[arrS])
{
    T max = array[0];
    for (int i = 1; i < arrS; i++)
        if (m[i] > max)
            max = m[i];
    return max; 
}
Конкретизация тогда может быть такая
C++
1
2
int arr[25];
int k=maxn<int,25>(arr);
0
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 2
18.04.2017, 21:17  [ТС]
Понял, спасибо!
Но почему тогда этот код комплируется без ошибок?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
 
template <typename T>
T maxn(const T array[count], int count)
{
    T max = array[0];
    for (int i = 1; i < count; i++)
        if (m[i] > max)
            max = m[i];
    return max; 
}
0
Модератор
Эксперт С++
 Аватар для zss
13781 / 10974 / 6491
Регистрация: 18.12.2011
Сообщений: 29,259
18.04.2017, 22:02
А это что:
Ошибка 1 error C2065: count: необъявленный идентификатор
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
18.04.2017, 22:08
Цитата Сообщение от zeroclona Посмотреть сообщение
Но почему тогда этот код комплируется без ошибок?
Это где это он "комплируется без ошибок"?
0
18.04.2017, 22:24

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это где это он "комплируется без ошибок"?
Попробовал скопировать себе этот код в блокнот - ошибок нету. Win 10 :p

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.04.2017, 22:37
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это где это он "комплируется без ошибок"?
Например, здесь: http://rextester.com/ACBVC2230
Это следствие одного прохода, который,
обещают исправить в следующих версиях.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
18.04.2017, 22:43
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Цитата Сообщение от Croessmah Посмотреть сообщение
Например, здесь: http://rextester.com/ACBVC2230
Это следствие одного прохода, который,
обещают исправить в следующих версиях.
Не совсем понимаю, о каком одном проходе идет речь. Если бы это было следствием какого-то одного прохода, то и исходный вариант с arrS компилировался бы. А он не компилируется.

Эксперимент показывает, что вариант с count компилируется потому, что компилятор расценивает его как ссылку на std::count. Это бессмысленно, но ситуацию каким-то извращенным образом спасает. С именем второго параметра это никак не связано.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.04.2017, 23:31
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Эксперимент показывает, что вариант с count компилируется потому, что компилятор расценивает его как ссылку на std::count. Это бессмысленно, но ситуацию каким-то извращенным образом спасает.
что это за эксперимент такой?

ни жосиси, ни шланг это не едят.
или вы исходите из достоверности показаний тс?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
18.04.2017, 23:39
Цитата Сообщение от hoggy Посмотреть сообщение
что это за эксперимент такой?
Я поигрался с исходным примером по ссылке (http://rextester.com/ACBVC2230) и вижу, что оно каким-то волшебным образом компилирует варианты

C++
1
2
3
4
5
6
7
8
template <typename T>
T maxn(const T array[count], int n)
 
template <typename T>
T maxn(const T array[flush], int n)
 
template <typename T>
T maxn(const T array[ends], int n)
и тому подобное.

А если убрать шаблонность

C++
1
2
3
4
5
6
7
8
int maxn(const int array[count], int count)
{
    int max = array[0];
    for (int i = 1; i < count; i++)
        if (m[i] > max)
            max = m[i];
    return max; 
}
то на строчку int max = array[0]; лезет какая-то странная ругань вида

Code
1
error C2440: 'initializing': cannot convert from 'const int [iterator_traits<_Iter>::difference_type std::count(_InIt,_InIt,const _Ty &)]' to 'int'
из чего я и сделал вывод, что этот count воспринимается как std::count.

И я говорю о глюках конкретного компилятора. "Жосиси и шланг" ту ни при чем.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.04.2017, 23:41
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я поигрался с исходным примером по ссылке (http://rextester.com/ACBVC2230)
так там жеж каель студийный.
он однопроходный.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
18.04.2017, 23:45
Цитата Сообщение от hoggy Посмотреть сообщение
так там жеж каель студийный.
Непереводимая игра слов на местном наречии?

Цитата Сообщение от hoggy Посмотреть сообщение
он однопроходный.
Уже второй раз упоминается какая-то "однопроходность". Что за "однопроходность" имеется в виду к чему она здесь - мне в упор не ясно.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.04.2017, 00:14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Непереводимая игра слов на местном наречии?
каель - cl
так называются студийные компиляторы

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что за "однопроходность" имеется в виду к чему она здесь - мне в упор не ясно.
Почему компилируется не объявленная переменная в шаблоне?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
19.04.2017, 00:31
Что-то какая-то каша наблюдается.

Во-первых, видимо речь идет о "two-phase lookup". Однако переводить это как "двухпроходность" несколько странно. Для реализации правильного поведения совсем не обязательно делать какие-то множественные "проходы". Также спецификация языка вообще ничего не знает ни про какой "two-phase lookup", а определяет правильное поведение несколько иными методами.

Во-вторых, пример по ссылке связан с особенностями name lookup в dependent базовых классах. Но это - совершенно отдельная тема, которая не имеет вообще никакого отношения к two-phase lookup. Или имеет? В общем, это зависит от того, что включать в тему two-phase lookup, а что нет.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2017, 11:37
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
и вижу, что оно каким-то волшебным образом компилирует варианты
Это известная бага VS, связанная с "two-phase lookup".

Как ответил на вопрос "когда это исправят в VS" Гор Нишанов (представитель Microsoft) на последней встрече Яндекса по С++, "надо писать сразу правильно"

Добавлено через 4 минуты
https://docs.microsoft.com/en-... onformance
Two-phase name lookup
Supported: No
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
19.04.2017, 12:49
Цитата Сообщение от MrGluck Посмотреть сообщение
Это известная бага VS, связанная с "two-phase lookup".
Я прекрасно знаю, что ныненшняя версия компилятора не поддерживает two-phase lookup. Но в упор не вижу, каким образом вы объясняете наблюдаемое поведение через two-phase lookup. Как я показал выше, "странная" интерпретация [count] в параметрах функции имеет место и в нешаблонном коде. При чем здесь вообще two-phase lookup?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2017, 13:09
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но в упор не вижу, каким образом вы объясняете наблюдаемое поведение через two-phase lookup.
Ну так компилятор от VS пропускает места, связанные с подстановкой имён для типов, связанных с параметром шаблона или входных параметров. Таким образом, в первой "фазе" проверяется лишь что имя count вообще существует (привет using namespace std) и код успешно компилируется. А был бы нормально реализован two-phase lookup, можно было бы без инстанцирования выявить ошибку с подстановкой count.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
19.04.2017, 13:14
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну так компилятор от VS пропускает места, связанные с подстановкой имён для типов, связанных с параметром шаблона или входных параметров.
И каким же образом имя count в моем примере "связано с параметром шаблона или входными параметрами"? Обратите внимание, что имя arrS там же вызывает ошибку сразу.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.04.2017, 13:18
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И каким же образом имя count в моем примере "связано с параметром шаблона или входными параметрами"?
Я прокомментировал код с шаблонами и конкретно строчку
Цитата Сообщение от MrGluck Посмотреть сообщение
и вижу, что оно каким-то волшебным образом компилирует варианты
Да, здесь помимо прочего count воспринимается как std::count. Но именно из-за отсутствия two-phase name lookup код с count компилируется. И это объяснение ТС-у на
Цитата Сообщение от zeroclona Посмотреть сообщение
При этом, если arrS поменять на count, то компилятор перестает возмущаться.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13203 / 6838 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
19.04.2017, 17:18
Цитата Сообщение от MrGluck Посмотреть сообщение
Да, здесь помимо прочего count воспринимается как std::count. Но именно из-за отсутствия two-phase name lookup код с count компилируется. И это объяснение ТС-у на
Ну вот объясните мне детально, по шагам, каким образом отсутствие two-phase lookup позволяет компилироваться варианту с count и не позволяет компилироваться варианту с arrS. Я пока не увидел никакого объяснения, кроме непрерывного повторения мантры "из-за отсутствия two-phase name lookup", "из-за отсутствия two-phase name lookup"...
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2017, 17:18
Помогаю со студенческими работами здесь

Необъявленный идентификатор
Нужно исправить код, некоторые ошибки я нашел, но ничего не могу поделать с i (i: необъявленный идентификатор), (идентификатор i не...

Необъявленный идентификатор
И снова ВСЕМ добрый вечер!!!:) Написав десяток примеров из книги, в качестве упражнений для себя и закрепления материала решил на...

Необъявленный идентификатор
Думаю проблему в скобках, где не могу найти=( #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; void main() { ...

необъявленный идентификатор
#include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int vichis(int,int,int&amp;); void cifri(int); void main() { int a; ...

Необъявленный идентификатор
Кто знает, где ошибка в этом коде? double *increase(unsigned int size, double *n) { double *new_n; for (int var = 0; var &lt;= size...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru