1

テンプレートを使用する配列クラスの形式があります。テンプレートを使用しているため、クラス全体がヘッダーファイルで宣言および定義されます。

template<typename Type>
class KSArray
{
    friend bool operator==(const KSArray &lhs, const KSArray &rhs);
    friend bool operator<(const KSArray &lhs, const KSArray &rhs);

public:
    typedef size_t size_type;
    typedef Type value_type;

    KSArray();
    KSArray(const KSArray &k);
    KSArray& operator=(const KSArray &rhs);
    ~KSArray();
    KSArray(int n);
    KSArray(int n, value_type t);

    value_type& operator[](int index);
    const value_type& operator[](int index) const;

    size_type size() const;
    value_type* begin();
    value_type* begin() const;
    value_type* end();
    value_type* end() const;

private:
    size_type _size;
    value_type* _arrayPtr;
};

すべての関数を定義しましたが、==演算子と<演算子を除いてほとんどの関数が機能します。それらは次のように定義されます。

template<typename Type>
bool operator==(const KSArray<Type> &lhs, const KSArray<Type> &rhs)
{
    if(lhs._arrayPtr==rhs._arrayPtr)
    {
        return true;
    }
    else if(lhs._size==rhs._size)
    {
        for(size_t i=0;i<lhs._size;++i)
        {
            if(lhs->_arrayPtr[i]!=rhs->_arrayPtr[i])
            {
                return false;
            }
            else
            {
                continue;
            }
        }

        return true;
    }
    else
    {
        return false;
    }
}

template<typename Type>
bool operator<(const KSArray<Type> &lhs, const KSArray<Type> &rhs)
{
    if(lhs==rhs)
    {
        return false;
    }
    else
    {
        for(int i=0;i<min(lhs._size,rhs._size);++i)
        {
            if(lhs->_arrayPtr[i]==rhs->arrayPtr[i])
            {
                continue;
            }
            else if(lhs->_arrayPtr[i]<rhs->arrayPtr[i])
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        return (lhs._size<rhs._size);
    }
}

メインのテストファイルでこのコードを実行すると、いくつかのリンカーエラーが発生します。

Undefined symbols for architecture x86_64:
  "operator==(KSArray<int> const&, KSArray<int> const&)", referenced from:
      test_class_KSArray_equality_comparisons(Tester&) in ksarray_test.o
      bool operator!=<int>(KSArray<int> const&, KSArray<int> const&) in ksarray_test.o
      bool operator<=<int>(KSArray<int> const&, KSArray<int> const&) in ksarray_test.o
      bool operator><int>(KSArray<int> const&, KSArray<int> const&) in ksarray_test.o
  "operator<(KSArray<int> const&, KSArray<int> const&)", referenced from:
      test_class_KSArray_order_comparisons(Tester&) in ksarray_test.o
      bool operator<=<int>(KSArray<int> const&, KSArray<int> const&) in ksarray_test.o
      bool operator><int>(KSArray<int> const&, KSArray<int> const&) in ksarray_test.o
      bool operator>=<int>(KSArray<int> const&, KSArray<int> const&) in ksarray_test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

エラーが示すように、作成する必要のあるコードを最小限に抑えるために、他の演算子で==および<演算子を使用しています。私が行った調査から、問題はconstとおそらくTypeの配置にあると思います。私はそれらを動かして、役に立たないように微調整してみました。何か案は?

Mac OSX10.8.2のAppleLLVM4.2C++コンパイラでXCode4.6を使用しています。

4

2 に答える 2

0

コンストラクターの前に明示的なキーワードを試してください。変換コンストラクターの問題に直面していて、int引数が暗黙的にKSArrayに変換されているように見えます。

于 2013-02-17T05:39:25.933 に答える
0

教授と話をした後、テンプレートと友達が少し奇妙に機能することがわかりました:http: //www.parashift.com/c++-faq/template-friends.html

上記のリンクを使用して、問題を解決する方法を見つけることができました。私の最初の調査では、問題が友人やテンプレートに関係していることに気づいていませんでした。constか何か変な問題だと思いました。

于 2013-02-18T20:58:52.170 に答える