我正在尝试编译一些D.我编写的代码使用std.string
库以及std.algorithm
。我的一个函数在字符串上调用indexOf
:不幸的是,indexOf
中显然还有一个std.algorithm
函数,编译器不喜欢它:
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怎么样?
答案 0 :(得分: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
。或者如果你把它放在模块级别,那么它将影响整个模块。
但是,由于bug,UFCS(通用函数调用语法)当前不能使用本地别名,因此如果将别名放在函数中,则必须执行{{1}而不是indexOf(str, c)
。
第三种选择是使用选择性导入:
str.indexOf(c)
使用该导入,只有import std.string : indexOf;
从std.string导入,当您使用indexOf
时,它将使用indexOf
版本(即使您还导入了std) 。算法)。除了选择性导入以外,你甚至可以定期导入std.string来获取std.string的其余部分,而选择性导入仍然可以解决冲突(在这种情况下,它与导入std.string然后真的没那么不同别名string
)。但是,由于bug,选择性导入始终被视为公共导入,因此在模块中选择性导入indexOf
将影响导入它的每个模块(可能导致新的冲突),因此您可以我想在此时避免它。