我有一种使用模板的数组类形式。因为它使用模板,所以在头文件中声明和定义了整个类。
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);
}
}
当我在 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)
正如错误所暗示的那样,我在其他运算符中使用 == 和 < 运算符,以最小化我必须编写的代码。从我所做的研究来看,我认为问题在于我对 const 的位置,也许还有 Type。我试过移动它们并调整它们无济于事。有任何想法吗?
我在 Mac OS X 10.8.2 上使用 XCode 4.6 和 Apple LLVM 4.2 C++ 编译器。