2013-02-15 4 views
3

Я пытаюсь скомпилировать некоторые D. В написанном мной коде используется библиотека std.string, а также std.algorithm. Одна из моих функций вызывает indexOf на строку: к сожалению, по-видимому, есть также функция indexOf в std.algorithm, и компилятор не нравится:как разрешить «конфликты с» ошибки в d?

assembler.d(81): Error: std.algorithm.indexOf!("a == b", string, immutable(char)).indexOf at /usr/share/dmd/src/phobos/std/algorithm.d(4431) conflicts with std.string.indexOf!(char).indexOf at /usr/share/dmd/src/phobos/std/string.d(334) 
assembler.d(81): Deprecation: function std.algorithm.indexOf!("a == b", string, immutable(char)).indexOf is deprecated 

Как обойти это? В C++ я мог использовать ::, чтобы явно указать, в каком пространстве имен я вхожу ... как насчет D?

ответ

7

Если вы хотите позвонить по телефону std.string.indexOf в явном виде, сделайте std.string.indexOf(str, c) вместо indexOf(str, c) или str.indexOf(c).

Или вы можете использовать псевдоним:

alias std.string.indexOf indexOf; 

Если положить, что внутри функции, в которой вы звоните indexOf, то он должен затем рассмотреть indexOf быть std.string.indexOf для остальной части функции. Или, если вы поместите его на уровне модуля, это повлияет на весь модуль.

Однако из-за , UFCS (универсальная функция вызова Синтаксис) в настоящее время не работает с локальными псевдонимами, так что если вы поместите псевдоним внутри функции, вы должны будете сделать indexOf(str, c) вместо str.indexOf(c).

Третий вариант заключается в использовании селективного импорта:

import std.string : indexOf; 

С этим импортом, только indexOf импортируются из std.string, а также при использовании indexOf, он будет использовать версию string (даже если вы также импортируете std.algorithm). И вы даже можете импортировать std.string регулярно в дополнение к выборочному импорту, чтобы получить остальную часть std.string, и выборочный импорт по-прежнему будет устранять конфликт (в этом случае он действительно не отличается от импорта std.string, а затем алиасы indexOf). Однако из-за bug выборочный импорт всегда рассматривается как открытый, поэтому выборочный импорт indexOf в модуле повлияет на каждый модуль, который его импортирует (потенциально вызывая новые конфликты), поэтому вы можете избежать этого на данном этапе.

Смежные вопросы