XCode链接器错误,未定义的引用,模板,Const

时间:2013-02-17 05:31:33

标签: c++ xcode templates linker const

我有一个使用模板的数组类。因为它使用模板,所以在头文件中声明和定义整个类。

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;
};

我已经定义了所有函数,除了==和&lt;之外,它们中的大多数都可以工作。运营商。它们的定义如下:

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);
    }
}

当我在main中使用我的测试文件运行此代码时,我收到一些链接器错误:

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)

如错误所示,我使用==和&lt;我的其他运算符中的运算符,以便最小化我必须编写的代码。 从我所做的研究中,我认为问题在于我的const和也许是Type的位置。我试过移动它们并调整它们无济于事。有什么想法吗?

我在Mac OS X 10.8.2上使用XCode 4.6和Apple LLVM 4.2 C ++编译器。

2 个答案:

答案 0 :(得分:0)

您可以在构造函数之前尝试显式关键字吗?在我看来,你正面临着转换构造函数的问题,你的int参数被隐式转换为KSArray ..

答案 1 :(得分:0)

在与我的教授交谈后,我发现模板和朋友的工作有些奇怪:http://www.parashift.com/c++-faq/template-friends.html

使用上面的链接,我能够弄清楚如何解决我的问题。在我最初的研究期间,我不知道这个问题涉及朋友和模板。我认为这是const的一个问题或者奇怪的东西。