C ++ Как объявить вне конструктора (Ошибка C2065 необъявленного идентификатора) - PullRequest
0 голосов
/ 04 июля 2019

Я новичок в программировании, и в моей домашней работе задача состоит в том, чтобы поменять местами вторые элементы на разных скопированных картах, где, если я что-то изменяю в копируемой версии, оригинальная карта также меняется, но я не знать, как написать функцию копирования.

template <class T, class P>
class map_swapper
{
public:
    map_swapper(map <T, P>& Cmap)
    {
        map<T, P> & copym(Cmap);
    }

    void swap(const T &t1, const T &t2) // I don't know if this function here is good or not because of the undeclared identifier error I can't get here, it is just a guess.
    {
        P a;
        a = copym[t1];
        copym[t1] = copym[t2];
        copym[t2] = a;
    }
};

int main()
{

    std::map<int, std::string> mapS1;
    map_swapper<int, std::string> mapS2(mapS1);

    mapS1[0] = "zero";
    mapS1[1] = "one";
    mapS1[2] = "two";

    std::map<int, int> mapI1;
    map_swapper<int, int> mapI2(mapI1);

    mapI1[0] = 0;
    mapI1[1] = 1;
    mapI1[2] = 2;

    mapS2.swap(0, 2);
    mapI2.swap(0, 1);

    for (typename std::map <int, std::string> ::iterator it = mapS1.begin(); it != mapS1.end(); it++)
    {
        std::cout << it->first << " ";
        std::cout << it->second << std::endl;
    }
    for (typename std::map <int, int> ::iterator it = mapI1.begin(); it != mapI1.end(); it++)
    {
        std::cout << it->first << " ";
        std::cout << it->second << std::endl;
    }

    return 0;
}

Я получаю Error C2065 'copym': undeclared identifier, так как я объявил 'copym' в конструкторе, но не знаю, как вытащить объявление оттуда и использовать конструктор только для присваивания.

Вывод должен быть таким:

0 two
1 one
2 zero
0 1
1 0
2 2

1 Ответ

0 голосов
/ 04 июля 2019

Вот моя версия вашего кода. Непроверенный, должен хотя бы компилироваться.

template <class T, class P>
class map_swapper
{
public:
    map_swapper(map <T, P>& Cmap) : copym(Cmap)
    {
    }

    void swap(const T &t1, const T &t2)
    {
        P a = copym[t1];
        copym[t1] = copym[t2];
        copym[t2] = a;
    }
private:
    map<T, P> & copym;
};

Все еще думаю, что использование класса для этого немного странно.

...