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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
#1

Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов - C++

05.07.2013, 14:39. Просмотров 907. Ответов 12
Метки нет (Все метки)

Подскажите, почему ругается на вызов функции print?

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
27
28
29
30
31
32
33
34
#include <iostream>
 
using namespace std;
 
template <class T>
void ForEach(T *begin, T *end,T f(T elem))
{
    for(; begin<end; ++begin) *begin = f(*begin);
}
template <class A>
void print(A *mas[], int n )
{
    for(int i=0;i<n;i++) cout<<*(mas[i])<<" ";
    cout<<endl;
}
int sum(int a){ return a+a;}
 
int mul(int a){ return a*a;}
 
double div2(double a){ return a/2;}
 
 
int main(int argc, char *argv[])
{
    int n = 10;
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    double b[15] = {10,20,30,4050,50,60,70,80,90,100,110,120,130,140,150};
    ForEach(a,a+10,sum);
    ForEach(b,b+15,div2);
    print(a,n);
 
 
    return 0;
}
IntelliSense: отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов типы аргументов: (int [10], int)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов (C++):

Ошибка в шаблоне функции: "Отсутствуют экземпляры шаблон функции, соответствующие списку аргументов" - C++
#include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;map&gt; #include &lt;Windows.h&gt; #include &lt;functional&gt; #include &lt;string&gt; #include...

Потоки с стандарте C++ 11. Отсутствуют экземпляры конструктора, соответствующие списку аргументов - C++
Tvector.push_back(thread(threadFunction,mas,i,3,4,76,55)); сама функция void threadFunction(int *arr, int b,int c , int z,int q,int r) ...

Потоки. Ошибка отсутствуют экземпляры конструктора, соответствующие списку аргументов - C++
void Engine::run() { long startTime; long timeMillis; long waitTime; long totalTime = 0; int frameCount = 0; ...

Ошибка: отсутствуют экземпляры шаблон функции - C++
Всем доброго времени суток. Решил отработать на практике алгоритм быстрой сортировки и столкнулся с такой ошибкой: отсутствуют...

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон" - C++
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...

Вставка в map и ошибка "Отсутствуют экземпляры конструктора" - C++
Подчёркивает map в 3тей строчке и пишет ошибку 1 IntelliSense: отсутствуют экземпляры конструктора &quot;std::pair&lt;_Ty1, _Ty2&gt;::pair &quot;,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.07.2013, 14:49 #2
PinkPink, Потому что вы пытаетесь принимать массив указателей, а посылаете массив элементов
1Вирт1
55 / 53 / 5
Регистрация: 25.08.2011
Сообщений: 448
05.07.2013, 14:54 #3
Попробуйте заменить:
C++
1
2
3
4
5
6
template <class A>
void print(A *mas, int n )
{
    for(int i=0;i<n;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
05.07.2013, 15:06  [ТС] #4
Цитата Сообщение от 1Вирт1 Посмотреть сообщение
Попробуйте заменить:
C++
1
2
3
4
5
6
template <class A>
void print(A *mas, int n )
{
    for(int i=0;i<n;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
Да, так работает. Только доступ к элементам массива в функции тогда вот нужно делать:
C++
1
mas[i]
без разыменования.

А как ещё можно корректно передать указатель на массив и получить доступ к элементам? Есть ещё какие-то способы, кроме этого?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.07.2013, 15:11 #5
PinkPink, А чем не понравилось
C++
1
2
3
4
5
6
template <class A>
void print(A mas[], int n )
{
    for(int i=0;i<n;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
или
C++
1
2
template<class A, int N>
void print(A (&mas)[N])
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
05.07.2013, 15:17  [ТС] #6
Цитата Сообщение от ForEveR Посмотреть сообщение
PinkPink, А чем не понравилось
C++
1
2
3
4
5
6
template <class A>
void print(A mas[], int n )
{
    for(int i=0;i<n;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
или
C++
1
2
template<class A, int N>
void print(A (&mas)[N])
Да нет, вполне всё нравится. Это для общего развития. Спасибо за информацию и объяснение.

Добавлено через 3 минуты
C++
1
2
template<class A, int N>
void print(A (&mas)[N])
А в этом случае как будет выглядеть вызов функции?
1Вирт1
55 / 53 / 5
Регистрация: 25.08.2011
Сообщений: 448
05.07.2013, 15:23 #7
Вызов будет выглядеть так:
C++
1
print(a);
Но для того что бы скомпилировалось в функции нужно будет n заменить на N, то есть:
C++
1
2
3
4
5
6
template<class A, int N>
void print(A (&mas)[N])
{
    for(int i=0;i< N;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
05.07.2013, 15:28 #8
не понимаю, зачем так писать:
C++
1
2
3
4
5
6
template<class A, int N>
void print(A (&mas)[N])
{
    for(int i=0;i< N;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
если компилятор все равно переведет в такой вид:
C++
1
2
3
4
5
6
template <class A>
void print(A *mas, int n )
{
    for(int i=0;i<n;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
05.07.2013, 15:29  [ТС] #9
Цитата Сообщение от 120° Посмотреть сообщение
не понимаю, зачем так писать:


если компилятор все равно переведет в такой вид:
C++
1
2
3
4
5
6
template <class A>
void print(A *mas, int n )
{
    for(int i=0;i<n;i++) cout<<mas[i]<<" ";
    cout<<endl;
}
ну это было ради интереса)
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.07.2013, 15:32 #10
120°, Куда компилятор приведет? Зачем? Это будет шаблонная функция, которая принимает ссылку на массив. При разных N будет уже совершенно другое инстанцирование функции.

C++
1
2
3
4
template<class A, int N>
void print(A (&array)[N])
{
}
При
C++
1
2
int array[] = {1};
print(array);
Функция раскроется в
C++
1
2
3
void print (int (&array)[1])
{
}
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
05.07.2013, 15:34 #11
Для справки - это два разных случая.
При *mas, mas[], mas[N] передается указатель на массив, а в (&mas)[N] передается дескриптор массива!
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
05.07.2013, 15:44 #12
Цитата Сообщение от ForEveR Посмотреть сообщение
Куда компилятор приведет? Зачем?
я немного не так выразился. имею ввиду если заголовок функции будет таким:
C++
1
void print(A mas[], int n ); // квадратные скобки
то в результате получится:
C++
1
void print(A *mas, int n );
Добавлено через 7 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
а в (&mas)[N] передается дескриптор массива!
не объясните что такое дескриптор? я так понимаю что это ссылка? спасибо...
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
05.07.2013, 15:52 #13
120°, Для массивов создактся дескриптор, в котором содержаться такие данные, как размер массива, адрес первого элемента и т.д. Врядли он присутствует в скомпилированном коде, но он имеет значение во время компиляции.
Когда передается указатель на первый элемент массива, все данные теряются, ибо указатель их не содержит.
Когда мы передаем ссылку на массив, то функция в конечном итоге, скорее всего, будет получать указатель на начало массива, но для компилятора будет присутствовать и дескриптор. Можете проверить для обоих случаев размер переданного с помощью sizeof. С указателем покажет размер указателя, с ссылкой - размер массива, следовательно имеем уже не просто указатель, а именно массив, как данное
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 15:52
Привет! Вот еще темы с ответами:

Проблемы с конструктором. "отсутствуют экземпляры перегружена функция GradeBook::GradeBook" - C++
// Заголовок GradeBook.h #include &lt;string&gt; using std:: string; class GradeBook { public:

Исправить ошибку компиляции "для использования класса шаблон требуется список аргументов шаблона" - C++
Решил создать класс List для задания двусвязного списка, и в самом начале компилятор начал ругаться на шаблон класса: error C2955:...

Отсутствуют экземпляры перегруженной функции modf - C++
#include &lt;iostream&gt;; #include &lt;conio.h&gt;; #include &lt;cmath&gt;; int main() { using namespace std; cout &lt;&lt; &quot;Vvedit roku&quot; &lt;&lt;...

Отсутствуют экземпляры перегруженной функции getline - C++
не могу решить проблему #define _CRT_SECURE_NO_WARNINGS #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;stdio.h&quot; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.07.2013, 15:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru