XCode链接器错误,未定义的引用,模板,构造
XCode Linker Errors, Undefined References, Templates, 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;
};
我已经定义了所有的函数,除了==和<操作员。它们的定义如下:
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 OS X 10.8.2上使用XCode 4.6和Apple LLVM 4.2 C++编译器。
请在构造函数之前尝试显式关键字。在我看来,您正面临转换构造函数的问题,而您的int参数正隐式转换为KSArray。。
在与教授交谈后,我发现模板和朋友的工作方式有点奇怪:http://www.parashift.com/c++-faq/template-friends.html
使用上面的链接,我能够找出如何解决我的问题。在我最初的研究中,我没有意识到这个问题涉及到朋友和模板。我觉得这是const的问题或者是什么奇怪的东西。
相关文章:
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 我可以引用模板的基类吗?
- 引用模板参数中的模板类型
- 引用模板类型的赋值运算符需要非常量重载
- 引用模板参数类型上的static_assert
- 何时首选常量左值引用而不是右值引用模板
- 如何声明自我引用模板类型
- 如何改进自引用模板的实现
- 自引用模板
- 具有引用模板参数的函数模板
- 模板参数中的自引用模板
- 使用默认类型替换c++函数引用模板错误
- 未定义的引用(模板)
- 如何明确地引用模板重载的函数
- map带有const模板形参和const引用模板形参
- 具有指针引用模板形参的c++模板成员函数
- 引用模板化类/对象的数据成员
- 引用模板(别名?)的语法
- 非类型(引用)模板参数和链接
- 具有“const char*”专业化的传递引用模板函数