3

我正在尝试编译一些 D。我编写的代码使用该std.string库以及std.algorithm. 我的一个函数调用indexOf一个字符串:不幸的是,显然还有一个indexOf函数 in 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 呢?

4

1 回答 1

7

如果要std.string.indexOf显式调用,请使用orstd.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;

通过该导入,仅从indexOfstd.string 导入,当您使用 时indexOf,它将使用该string版本(即使您还导入了 std.algorithm)。而且你甚至可以在选择性导入的同时定期导入std.string来获取std.string的其余部分,选择性导入仍然可以解决冲突(在这种情况下,它与导入std.string然后别名indexOf)。但是,由于一个错误,选择性导入总是被视为公共的,因此indexOf在模块中进行选择性导入会影响导入它的每个模块(可能会导致新的冲突),因此此时您可能希望避免它。

于 2013-02-15T04:38:35.433 回答