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

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

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

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

05.07.2013, 14:39. Просмотров 829. Ответов 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++ 11. Отсутствуют экземпляры конструктора, соответствующие списку аргументов
Потоки. Ошибка отсутствуют экземпляры конструктора, соответствующие списку аргументов C++
Ошибка: отсутствуют экземпляры шаблон функции C++
C++ Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"
Вставка в map и ошибка "Отсутствуют экземпляры конструктора" C++
Проблемы с конструктором. "отсутствуют экземпляры перегружена функция GradeBook::GradeBook" C++
Исправить ошибку компиляции "для использования класса шаблон требуется список аргументов шаблона" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
05.07.2013, 14:49     Отсутствуют экземпляры шаблон функции "print", соответствующие списку аргументов #2
PinkPink, Потому что вы пытаетесь принимать массив указателей, а посылаете массив элементов
1Вирт1
55 / 53 / 5
Регистрация: 25.08.2011
Сообщений: 444
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Сообщений: 444
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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", соответствующие списку аргументов
Еще ссылки по теме:
Отсутствуют экземпляры перегруженной функции getline C++
C++ Отсутствуют экземпляры перегруженной функции modf
Отсутствуют экземпляры перегруженной функции log10 и log (фото ниже) - C++ C++
C++ Ошибка "Слишком много аргументов в вызове функции"
Ошибка "Слишком много аргументов в вызове функции" C++

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

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

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