С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 20.03.2016
Сообщений: 3
1

При вызове метода функционального объекта в шаблонной функции ошибка компиляции C2039

30.05.2017, 19:52. Показов 1566. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Объект класса Entry - это запись в журнале экзаменационной сессии: номер зачетки, фамилия, курс, группа, дисциплина, оценка. В задаче есть контейнер из этих записей.
Проблема такая: возникает ошибка компиляции Ошибка C2039 getAvrMark: не является членом "std::basic_string<char,std::char_traits<char>,std::allocator<char>>". Вот код функции (она является методом шаблонного класса Container, у которого поле с - это контейнер стандартной библиотеки):

C++
1
2
3
4
5
template<class Calc>
double calcAverageMark(Calc calc) const {
   std::for_each(c.begin(), c.end(), calc);
   return calc.getAvrMark(); //Ошибка тут! 
}
Есть также class MyContainer: public Container<Entry>, специализирующий Container, внутри которого есть такие методы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//query - это значение поля, вводимое пользователем, то есть, например, "мат. анализ"
//функция возвращает среднюю оценку по дисциплине
double MyContainer::calcAverageMarkByDiscipline(const std::string query) const {
    AvrMarkByDiscipline calc = AvrMarkByDiscipline(query);
    return calcAverageMark(calc); 
}
 
//функция возвращает среднюю оценку по курсу (заданному параметром query)
double MyContainer::calcAverageMarkByCourse(const int query) const {
    AvrMarkByCourse calc = AvrMarkByCourse(query);
    return calcAverageMark(calc);
}
 
//функция возвращает среднюю оценку по группе
double MyContainer::calcAverageMarkByGroup(const std::string query) const {
    AvrMarkByGroup calc = AvrMarkByGroup(query);
    return calcAverageMark(calc);
}
И вот код функциональных объектов:

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
35
36
37
//вычисляют среднюю оценку
 
class AvrMarkByDiscipline
{
private:
    std::string discipline;
    int count = 0;
    int sum = 0;
public:
    AvrMarkByDiscipline(const std::string d);
    double getAvrMark();
    void virtual operator()(const Entry en);
};
 
class AvrMarkByCourse
{
private:
    int course;
    int count = 0;
    int sum = 0;
public:
    AvrMarkByCourse(const int crs);
    double getAvrMark();
    void virtual operator()(const Entry en);
};
 
class AvrMarkByGroup
{
private:
    std::string group;
    int count = 0;
    int sum = 0;
public:
    AvrMarkByGroup(const std::string grp);
    double getAvrMark();
    void virtual operator()(const Entry en);
};
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
35
36
37
38
39
40
41
42
43
44
45
46
AvrMarkByDiscipline::AvrMarkByDiscipline(const std::string d) {
    discipline = d;
}
 
double AvrMarkByDiscipline::getAvrMark() {
    return sum / count;
}
 
void AvrMarkByDiscipline::operator()(const Entry en) {
    if (en.getDiscipline() == discipline) {
        ++count;
        sum += en.getMark();
    }
}
 
 
AvrMarkByCourse::AvrMarkByCourse(const int crs) {
    course = crs;
}
 
double AvrMarkByCourse::getAvrMark() {
    return sum / count;
}
 
void AvrMarkByCourse::operator()(const Entry en) {
    if (en.getCourse() == course) {
        ++count;
        sum += en.getMark();
    }
}
 
 
AvrMarkByGroup::AvrMarkByGroup(const std::string grp) {
    group = grp;
}
 
double AvrMarkByGroup::getAvrMark() {
    return sum / count;
}
 
void AvrMarkByGroup::operator()(const Entry en) {
    if (en.getGroup() == group) {
        ++count;
        sum += en.getMark();
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2017, 19:52
Ответы с готовыми решениями:

Ошибка сборки при раздельной компиляции шаблонной функции
Помогите с ошибкой, никак не могу найти решение #pragma once #include &lt;iostream&gt; #include...

ошибка при вызове метода объекта
Здравствуйте, ребят, у меня тут вот какое дело - программа запускается, я в ней работаю, дохожу до...

Обрыв функции при вызове метода из объекта другого класса
Почему выполнение функция обрывается на вызове метода из объекта другого класса? DataBuffer.cpp...

Ошибка компиляции при вызове функции
Доброго времени суток Всем! Есть небольшая проблема - МК STM32F030, среда KEIL 5, подключаю...

4
27 / 21 / 9
Регистрация: 26.01.2013
Сообщений: 168
30.05.2017, 19:56 2
Попробуйте явно указывать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//query - это значение поля, вводимое пользователем, то есть, например, "мат. анализ"
//функция возвращает среднюю оценку по дисциплине
double MyContainer::calcAverageMarkByDiscipline(const std::string query) const {
    AvrMarkByDiscipline calc = AvrMarkByDiscipline(query);
    return calcAverageMark<AvrMarkByDiscipline >(calc); 
}
 
//функция возвращает среднюю оценку по курсу (заданному параметром query)
double MyContainer::calcAverageMarkByCourse(const int query) const {
    AvrMarkByCourse calc = AvrMarkByCourse(query);
    return calcAverageMark<AvrMarkByCourse >(calc);
}
 
//функция возвращает среднюю оценку по группе
double MyContainer::calcAverageMarkByGroup(const std::string query) const {
    AvrMarkByGroup calc = AvrMarkByGroup(query);
    return calcAverageMark<AvrMarkByGroup >(calc);
0
0 / 0 / 0
Регистрация: 20.03.2016
Сообщений: 3
30.05.2017, 20:02  [ТС] 3
не помогло(
0
27 / 21 / 9
Регистрация: 26.01.2013
Сообщений: 168
30.05.2017, 20:12 4
смущает только ваш for_each, а конкретнее переменная c
0
0 / 0 / 0
Регистрация: 20.03.2016
Сообщений: 3
30.05.2017, 20:43  [ТС] 5
Такой там класс
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
35
36
37
38
39
template<class T>
class Container
{
public:
 
    Container() {
        c = std::deque<T>();
    }
 
    ~Container(){}
 
    /*
...другие методы
*/
    template<class Calc>
    double calcAverageMark(Calc calc) const {
        std::for_each(c.begin(), c.end(), calc);
        return calc.getAvrMark();
    }
 
    std::deque<T>& getCont() {
        return c;
    }
 
    void setCont(std::deque<T> value) {
        c = value;
    }
 
    int size() {
        return c.size();
    }
 
    bool empty() {
        return c.empty();
    }
 
protected:
    std::deque<T> c;
};
Добавлено через 28 минут
Все, исправила. Оказалась глупая ошибка по невнимательности там, где я эти функции вызываю в главной программе. А я-то уж голову чуть не сломала, была уверена, что здесь где-то косяк
0
30.05.2017, 20:43
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2017, 20:43
Помогаю со студенческими работами здесь

Ошибка компиляции при вызове функции strcpy
Подскажите пожалуйста чего он ругается

Ошибка компиляции при вызове виртуальной функции
Здравствуйте. Сильно не плюйтесь, в С я не силен. Пишу на джаве, но попал в руки код, в котором...

Непонятная ошибка при вызове функции от тут же создаваемого объекта
Ошибка появляется в строке 42: #include &quot;list.h&quot; #include &lt;iostream&gt; using namespace std; int...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru