ld:找不到架构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

时间:2017-03-23 14:34:16

标签: c++ linker

我必须用c ++做一个自定义的“矢量”课作为我大学的作业,但我正在努力学习模板。

我将所有变量的类型更改为类型模板'typename T'后出现此错误。问题是编译器只指向声明为“朋友”函数的函数。即从编译器的消息中看到的(运算符'=='和'<<'):

架构x86_64的未定义符号:   “operator ==(Vector const&,Vector const&)”,引自:       _main在main.o中   “operator<<(std :: __ 1 :: basic_ostream>&,Vector)”,引自:       _main在main.o中 ld:找不到架构x86_64的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

这是头文件中这两个友元操作符函数的声明及其实现。

friend ostream& operator <<(ostream& out, Vector<T> x);
friend bool operator == (const Vector<T> &lop, const Vector<T> &rop);

template <typename T>
 bool operator == (const Vector<T> &lop, const Vector<T> &rop){
    if(lop.size() != rop.size()){
 return false;
}
else{
    int counter = 0;
    for(int i = 0; i < lop.size(); i++){
        for(int j = 0; j < rop.size(); j++){
            if(lop.values[i] == rop.values[j]){
                counter++;
            }
        }
if((counter == lop.size()) && (counter == rop.size())){
            return true;
        }
    }
}
return false;

}




template <typename T>
ostream& operator <<(ostream& out, Vector<T> x)
{
out << "[";
for(int i = 0; i < x.size(); i++){
    out << x.values[i];
    if(i + 1 != x.size()){
        out << ", ";
    }
}
out << "]";
return out;
}

在main()函数中,我刚测试了这两个运算符:

#include <iostream>
#include "vector.hpp"
#include "vector.cpp"
using namespace std;

int main (){

    Vector<double> second(10);
    Vector<double> third {1.0, 2.0, 3.0, 4.0, 5.0};
    cout << third << endl;

    Vector<double> v(10);
    Vector<double> k(10);

    if(k == v){
    cout << "YES" << endl;
}
    else{
    cout << "NO" << endl;
}

    return 0;
}

我不明白为什么会收到此错误,所以我非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您应该在课程template <typename T>的{​​{1}}声明中添加friend

Vector