如何解决d中的“冲突”错误?

时间:2013-02-15 03:46:26

标签: namespaces d conflict

我正在尝试编译一些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怎么样?

1 个答案:

答案 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将影响导入它的每个模块(可能导致新的冲突),因此您可以我想在此时避免它。