Можете ли вы реализовать auto fn () -> decltype (exp) в качестве заголовка / реализации или он должен быть только заголовком? - PullRequest
0 голосов
/ 23 мая 2018

Итак, у меня есть следующий пример:

заголовочный файл:

class mymapclass
{
    std::multimap<int, int> mymap;

    auto get_mymap_value_range(int key_val) -> decltype(mymap.equal_range(key_val))
    {
        return mymap->equal_range(key_val);
    }
};

В файле cpp:

int main()
{
    mymapclass m;
    auto test = m.get_mymap_value_range(1);
    return 0;
}

Но если я хочу переместить реализациюget_mymap_value_range () в файл cpp Я получаю ошибку компилятора (MSVS2012 - не полностью c ++ 11, но, кажется, поддерживает эту функцию): C2228 слева от equal_range должен иметь класс / struct / union ...

Если я оставлю реализацию в шапке, это похоже на работу.Когда я переместил реализацию в файл cpp, он выглядел следующим образом:

header:

auto get_mymap_value_range(int key_val) -> decltype(mymap.equal_range(key_val));

cpp:

auto mymapclass::get_mymap_value_range(int key_val) -> decltype(mymap.equal_range(key_val))
{
    return mymap->equal_range(key_val);
}

1 Ответ

0 голосов
/ 23 мая 2018

Существует ряд проблем с вашим образцом, но auto не входит в их число.

Вам следует знать об одном правиле определения.Многие объекты C ++ могут быть определены только один раз.Например, функции и глобальные объекты могут быть определены только один раз.Помещая mymap и get_mymap_value_range в заголовок и дважды включая этот заголовок, вы нарушаете оба правила.

Вам может понадобиться extern std::multimap<int, int> mymap; в заголовке, поскольку не aопределение.

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

...