LINUX.ORG.RU

История изменений

Исправление DarkEld3r, (текущая версия) :

Примерно то же самое мне кажется сейчас.

«Я не специально». Правда. Так что объяснения буду рад услышать.

Как здесь поможет _компилятор_? Линковщик - может быть, но компилятор?

Возможно, ты прав. Честно говоря, просто не задумывался в какой момент станет понятно, что у нас несколько реализаций трейта. В любом случае, мне не особо нравится С++ подход, когда многие проблемы о которых линковщик мог бы сообщать «игнорируются» (в смысле UB, но обычно всё работает).

Но разве когда мы в программе пишем:

extern crate baz;
extern crate bletch;
Tо компилятор не может увидеть, что у нас имена символов совпадают?

Как подобный конфликт обходит предлагаемое тобой решение?

Например, так:

extern crate baz;
extern crate bletch;

// Переименовываем.
use baz::foo::FooTrait as BazFooTrait;
use bletch::foo::FooTrait as BletchFooTrait;

// Используем функцию foo из разных реализаций трейта FooTrait.
b.BazFooTrait::foo();
b.BletchFooTrait::foo();
Не очень изящно, но такие ситуации не должны часто возникать. Тем не менее, вероятность такого далеко не нулевая. Ну серьёзно - вот у нас сейчас в проекте сериализация из одной либы успешно работает с типами из другой. Обе либы не наши.

Исходная версия DarkEld3r, :

Примерно то же самое мне кажется сейчас.

«Я не специально». Правда. Так что объяснения буду рад услышать.

Как здесь поможет _компилятор_? Линковщик - может быть, но компилятор?

Возможно, ты прав. Честно говоря, просто не задумывался в какой момент станет понятно, что у нас несколько реализаций трейта. В любом случае, мне не особо нравится С++ подход, когда многие проблемы о которых линковщик мог бы сообщать «игнорируются» (в смысле UB, но обычно всё работает).

Но разве когда мы в программе пишем:

extern crate baz;
extern crate bletch;
Tо компилятор не может увидеть, что у нас имена символов совпадают?

> Как подобный конфликт обходит предлагаемое тобой решение? Например, так:

extern crate baz;
extern crate bletch;

// Переименовываем.
use baz::foo::FooTrait as BazFooTrait;
use bletch::foo::FooTrait as BletchFooTrait;

// Используем функцию foo из разных реализаций трейта FooTrait.
b.BazFooTrait::foo();
b.BletchFooTrait::foo();
Не очень изящно, но такие ситуации не должны часто возникать. Тем не менее, вероятность такого далеко не нулевая. Ну серьёзно - вот у нас сейчас в проекте сериализация из одной либы успешно работает с типами из другой. Обе либы не наши.