演算子の再定義とテンプレート クラスを混在させて、次の割り当てに到達しました。
j = end - begin;
私のメイン関数では、変数の型は次のとおりです。
ptrdiff_t j;
util::BaseArrayIterator<int, 6> begin, end;
Begin と End は util::BaseArray から初期化されています。
util::BaseArray<int, 6> ba(SOME_PARAMETERS);
begin = ba.begin(); end = ba.end();
BaseArrayIterator は自己実装の反復子型です。
エラーが発生します:
TestProject.obj : error LNK2019: unresolved external symbol "int __cdecl util::operator-(class util::BaseArrayIterator<int,6> const &,class util::BaseArrayIterator<int,6> const &)" (??Gutil@@YAHABV?$BaseArrayIterator@H$05@0@0@Z) referenced in function _main
メッセージ内の最初のコード ステートメントが原因です (これを削除すると問題が解決します)。
次の定義と宣言を含むヘッダー ファイルをインクルードしました。
namespace util {
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -
(const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR);
...
template<typename T, int n>
typename BaseArrayIterator<T,n>::difference_type operator -(
const BaseArrayIterator<T,n> &itL,
const BaseArrayIterator<T,n> &itR)
{ return -(itL.m_cnt - itR.m_cnt);
}
}
問題の原因は何ですか?コンパイラは util::operator - を検索していると報告したため、宣言は見つかりましたが、定義は見つかりませんでした。ただし、それらは同じファイル内にあります。そして、署名の間違いは見当たりません。
--- 注意を編集する ---------------------------------------------- --------------------------------
交換する
end-begin
と
util::operator-<int, 6>(end,begin)
問題は解決しますが、毎回パラメーターを明示的に指定したくありません。簡潔さは、演算子のオーバーロードを支持する主な議論の 1 つであるため、古典的な短い形式を使用したいと思います。
--- 編集注 2 -------------------------------------------- -------------------------------
Nicola Mussatti が親切に指摘したように、[解決策]:演算子のオーバーロードとテンプレートを使用した未解決の外部シンボルがここにあります。フレンド宣言はクラス内に移動する必要があります。
だから私はそうしました、そして私はすべて笑顔です。それらを再度分離すると、あいまいな過負荷の問題が発生しますが、これは以前と同じエラーではありません。