3

演算子の再定義とテンプレート クラスを混在させて、次の割り当てに到達しました。

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 が親切に指摘したように、[解決策]:演算子のオーバーロードとテンプレートを使用した未解決の外部シンボルがここにあります。フレンド宣言はクラス内に移動する必要があります。

だから私はそうしました、そして私はすべて笑顔です。それらを再度分離すると、あいまいな過負荷の問題が発生しますが、これは以前と同じエラーではありません。

4

1 に答える 1

0

どのコンパイラを使用していますか?

VS2010はこのコードに満足しています:

namespace util
{
    template<typename T>
    class BaseArrayIterator
    {
    public:
        typedef ptrdiff_t difference_type;

        int pos;
        T x;
    };

    template<typename T>
    typename BaseArrayIterator<T>::difference_type operator -
        (const BaseArrayIterator<T> &itL,
         const BaseArrayIterator<T> &itR);

    template<typename T>
    typename BaseArrayIterator<T>::difference_type operator -
        (const BaseArrayIterator<T> &itL,
         const BaseArrayIterator<T> &itR)
    {
        return itL.pos - itR.pos;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    util::BaseArrayIterator<int> a;
    util::BaseArrayIterator<int> b;

    ptrdiff_t dist = a - b;
    return 0;
}
于 2011-08-07T23:14:53.900 に答える