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

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

Восстановить пароль Регистрация
 
PinkPink
9 / 9 / 2
Регистрация: 10.05.2012
Сообщений: 279
05.07.2013, 14:39     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #1
Подскажите, почему ругается на вызов функции 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++
C++ Шаблон с переменным числом аргументов, и возвращаемое значение функции
отсутствуют экземпляры перегруженная функция getline C++
C++ Потоки с стандарте C++ 11. Отсутствуют экземпляры конструктора, соответствующие списку аргументов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.07.2013, 14:49     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #2
PinkPink, Потому что вы пытаетесь принимать массив указателей, а посылаете массив элементов
1Вирт1
55 / 53 / 5
Регистрация: 25.08.2011
Сообщений: 427
05.07.2013, 14:54     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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  [ТС]     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.07.2013, 15:11     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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  [ТС]     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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
Сообщений: 427
05.07.2013, 15:23     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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  [ТС]     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.07.2013, 15:32     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #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
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 15:34     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #11
Для справки - это два разных случая.
При *mas, mas[], mas[N] передается указатель на массив, а в (&mas)[N] передается дескриптор массива!
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
05.07.2013, 15:44     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #12
Цитата Сообщение от ForEveR Посмотреть сообщение
Куда компилятор приведет? Зачем?
я немного не так выразился. имею ввиду если заголовок функции будет таким:
C++
1
void print(A mas[], int n ); // квадратные скобки
то в результате получится:
C++
1
void print(A *mas, int n );
Добавлено через 7 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
а в (&mas)[N] передается дескриптор массива!
не объясните что такое дескриптор? я так понимаю что это ссылка? спасибо...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 15:52     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 15:52     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #13
120°, Для массивов создактся дескриптор, в котором содержаться такие данные, как размер массива, адрес первого элемента и т.д. Врядли он присутствует в скомпилированном коде, но он имеет значение во время компиляции.
Когда передается указатель на первый элемент массива, все данные теряются, ибо указатель их не содержит.
Когда мы передаем ссылку на массив, то функция в конечном итоге, скорее всего, будет получать указатель на начало массива, но для компилятора будет присутствовать и дескриптор. Можете проверить для обоих случаев размер переданного с помощью sizeof. С указателем покажет размер указателя, с ссылкой - размер массива, следовательно имеем уже не просто указатель, а именно массив, как данное
Yandex
Объявления
05.07.2013, 15:52     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов
Ответ Создать тему
Опции темы

Текущее время: 05:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru