Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Invalid use of nonstatic data member


Автор: MastEdm 4.8.2008, 14:46
Добрый день.

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

#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 статичным членом, но тогда не получается его юзать в других функциях класса. Ну это по причине кривых рук. Подскажите, как это правильно реализовать.

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

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

При ведите код со статическим buf и другими методами.

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

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


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


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


Автор: MastEdm 4.8.2008, 16:17
Сделал так:
Код

#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]’ для индекса массива

Автор: Earnest 4.8.2008, 16:32
Цитата(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)) {}       // а это конструктор



Автор: MastEdm 4.8.2008, 16:38
Ясно. Спасибо  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)