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

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

30.05.2017, 19:52. Показов 1553. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2017, 20:43
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru