Segfault из -за противоречивых типов в независимых компиляционных единицах (G ++)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Segfault из -за противоречивых типов в независимых компиляционных единицах (G ++)

Сообщение Anonymous »

Я наткнулся на проблему, которая приводит к сегфо, и я полностью в темноте, почему это происходит. Мне удалось воссоздать проблему в довольно минимальном рабочем примере, см. Ниже. Каждый Cu содержит различную реализацию карты, где возвращаемое значение функции std :: function может варьироваться, потому что разные классы нуждаются в разных реализациях этой карты для выполнения своей вещи. В каждом CU я определил структуру HandlerReturn . Я не выбрал уникальные имена, потому что они все равно не увидят друг друга. При доступе к Lambda программа Segfaults. Программа работает, когда я просто переименован в HandlerReturn , чтобы HandlerReturn2 во втором Cu. Вот минимальный рабочий пример. Пример был протестирован на Linux с использованием G ++ 13.3.0, LDD 2.39. < /P>
Редактировать: мне не было ясно, что именно я хочу знать; Я хочу знать почему это происходит. Я уже могу решить эту проблему, используя (неназванные) пространства имен или переименование вещей, но у меня всегда было впечатление, что отдельные переводные единицы в любом случае не имеют столкновений имен.// main.cc
#include

void fun1(std::string const &key);
void fun2(std::string const &key);

int main() {
fun1("string1");
fun2("string1");
}
< /code>
file1.cc
// file1.cc
#include
#include
#include

struct HandlerReturn {
bool state = false;
int value = 0;
};
using Handler = std::function;

std::unordered_map const _map1 = {
{
"string1", []() -> HandlerReturn { return {true, 1}; }
},
{
"string2", []() -> HandlerReturn { return {true, 2}; }
}
};

void fun1(std::string const &key) {
if (not _map1.contains(key)) {
std::cout

Подробнее здесь: https://stackoverflow.com/questions/797 ... on-units-g
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»