Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Invalid use of nonstatic data member 
V
    Опции темы
MastEdm
Дата 4.8.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

Репутация: 1
Всего: 2



Добрый день.

Имеем следующий код:
Код

#include <map>
#include <functional>

#define SIZE 100

class test {
public:
    int buf[SIZE];

    struct my_less : std::binary_function <const int&, const int&, bool>
    {
        result_type operator() (first_argument_type arg1, second_argument_type arg2)
        {
            return buf[arg1] > buf[arg2];
        }
    };
    typedef std::map<int, int, my_less> mymap;

    mymap m;

    test() {
        // Заполняем buf
    }

    void add(int a, int b) {
        m[a] = b;
    }
};


int main(void) {
    test m;
    return 0;
}



При компиляции получаю ошибку 
Код

$ g++ test.cpp
test.cpp: In member function ‘bool test::my_less::operator()(const int&, const int&)’:
test.cpp:14: ошибка: invalid use of nonstatic data member ‘test::buf’
test.cpp:14: ошибка: invalid use of nonstatic data member ‘test::buf’


Пытался сделать buf статичным членом, но тогда не получается его юзать в других функциях класса. Ну это по причине кривых рук. Подскажите, как это правильно реализовать.
PM MAIL   Вверх
Daevaorn
Дата 4.8.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(MastEdm @  4.8.2008,  15:46 Найти цитируемый пост)
Пытался сделать buf статичным членом, но тогда не получается его юзать в других функциях класса.  

Да, его необходимо делать статическим или переделывать архитектуру.
Цитата(MastEdm @  4.8.2008,  15:46 Найти цитируемый пост)
Ну это по причине кривых рук. Подскажите, как это правильно реализовать. 

При ведите код со статическим buf и другими методами.
PM MAIL WWW   Вверх
MastEdm
Дата 4.8.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

Репутация: 1
Всего: 2



Со статическим buf, к примеру, вот это уже не работает:
Код

test() {
    buf[0] = 1;
}


А как можно переделать архитектуру, чтобы работало? Хочется уметь и так, и так реализовывать  smile 


PM MAIL   Вверх
Earnest
Дата 4.8.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Поскольку my_less - это объект, передай ему в конструктор ссылку на буфер и все дела.




--------------------
...
PM   Вверх
MastEdm
Дата 4.8.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

Репутация: 1
Всего: 2



Сделал так:
Код

#include <map>
#include <functional>

#define SIZE 100

class test {
public:
    int buf[SIZE];

    struct my_less {
        int* buf;

        my_less(int* buf) {
            this->buf = buf;
        }

        bool operator() (const int& arg1, const int& arg2) {
            return buf[arg1] > buf[arg2];
        }
    };
    
    std::map<int, int, my_less(buf)> m;

    test() {
        buf[0] = 1;
    }

    void add(int a, int b) {
        m[a] = b;
    }
};


int main(void) {
    test m;
    return 0;
}



Вот что пишет:
Код

test.cpp:22: ошибка: ‘test::buf’ cannot appear in a constant-expression
test.cpp:22: ошибка: некорректный аргумент шаблона 3
test.cpp: In member function ‘void test::add(int, int)’:
test.cpp:29: ошибка: некорректные типы ‘int[int]’ для индекса массива

PM MAIL   Вверх
Earnest
Дата 4.8.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(MastEdm @  4.8.2008,  17:17 Найти цитируемый пост)
    std::map<int, int, my_less(buf)> m;

В объявлении типа нужно использовать класс, а не объект. А объект передать в конструктор:
Код

std::map<int, int, my_less> m;  // это мембер объявляется
test() : m (my_less(buf)) {}       // а это конструктор





--------------------
...
PM   Вверх
MastEdm
Дата 4.8.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.12.2005
Где: Москва, МГИУ

Репутация: 1
Всего: 2



Ясно. Спасибо  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.