流插入运算符 << 重载未定义的符号 用于体系结构x86_64错误



我目前正在学习如何为我的类重载流插入运算符。下面是我的代码:

#include <iostream>
#include <string>
using std::string;
using std::endl;
using std::cout;
template<typename T>
class A {
public:
A(T);
friend std::ostream& operator<<(std::ostream&, const A&);
T* value;
};
template<typename T>
A<T>::A(T input) {*value = input;}
template<typename T>
std::ostream& operator<<(std::ostream& out, const A<T>& obj) {
out << *(obj.value);
return out;
}
int main() {
A<string> foo("HELLO");
cout << foo << endl; 
return 0;
}

我在用G++编译代码后出现了这个错误

Undefined symbols for architecture x86_64:
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, A<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > const&)", referenced from:
_main in streamops-ef073c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

你知道可能出了什么问题吗?我正在遵循一个指南,没有看到我的操作员过载的区别。

问题是friend声明将函数声明为非模板函数。

您需要将其声明为模板:

template<typename U>
friend std::ostream& operator<<(std::ostream&, const A<U>&);

可选地,您可以在类内部内联定义函数:

friend std::ostream& operator<<(std::ostream& out, const A& obj) {
return out << *(obj.value);
} 

一个选项是使用类成员函数和非成员函数的组合。

template <typename T>
class A
{
public:
A(T);
std::ostream& write(std::ostream& out) const
{
return out << *value;
}
T* value;
};

template <typename T>
std::ostream& operator<<(std::ostream& out, const A<T>& obj)
{
erturn obj.write(out);
}

请注意您定义类的方式。

当构造函数被调用时,您的代码将运行到未定义的行为中。您正在使用

*value = input;

而CCD_ 2没有被初始化为指向有效对象。这不好。

相关内容

最新更新