3

私はいくつかの D をコンパイルしようとしています。私が書いたコードは、std.stringライブラリとstd.algorithm. 私の関数の 1 つが文字列を呼び出し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 はどうですか?

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 (Universal Function Call Syntax) は現在、ローカル エイリアスでは機能しないため、エイリアスを関数内に配置する場合は、indexOf(str, c)代わりにstr.indexOf(c).

3 番目のオプションは、選択的インポートを使用することです。

import std.string : indexOf;

indexOfそのインポートでは、 std.string からのみがインポートされ、 を使用indexOfすると、stringバージョンが使用されます (std.algorithm もインポートした場合でも)。また、残りの std.string を取得するための選択的インポートに加えて、std.string を定期的にインポートすることもできます。選択的インポートは引き続き競合を修正します (この場合、std.string をインポートしてからエイリアスindexOf)。ただし、バグにより、選択的インポートは常にパブリックとして扱われるため、モジュールでの選択的インポートを行うと、それをインポートindexOfするすべてのモジュールに影響を与える (新しい競合が発生する可能性がある) ため、この時点では回避することをお勧めします。

于 2013-02-15T04:38:35.433 に答える