【问题标题】:Overloading Insertion and Extraction Operators as Templates将插入和提取运算符重载为模板
【发布时间】:2017-09-11 16:51:52
【问题描述】:

我正在尝试重载 ostream 和 istream 作为模板中类的朋友。我在网上看过,但找不到太多关于模板重载的说明,而且我所看到的似乎表明这是orevload这些的正确方法。很明显,我对编程很陌生,希望能得到任何帮助。谢谢。

#include <stdio.h>
#include<vector>
#include<iostream>
using namespace std;
template<class T>
class MyClass

{
enter code here
public:
    MyClass();
    MyClass(const T& p_val1);
    MyClass(const MyClass<T>& p_val1);
    ~MyClass();
    MyClass<T>& operator=(MyClass<T>& rhs);

    friend ostream& operator<<(ostream& lhs, const MyClass<T> &printme);
    friend istream& operator>><T>(istream& lhs, MyClass<T>& readme);

private:
    T* m_val1;

};

ostream 和 istream 的实现。

template<class T>
ostream& operator<<(ostream&lhs, const MyClass<T>& printme)
{
    lhs << printme.m_val1;
    return lhs;
}
template<class T>
istream& operator>>(istream& lhs, MyClass<T>& readme)
{
    lhs >> *(readme.m_val1);
    return lhs;
}

这里是错误

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

主要功能

  MyClass<int> a(8);
    MyClass<int> b(9);
    cout << " Enter a value for the two types to be swapped: ";
    cin >> a >> b;
    cout << "Before swapping...\n";
    cout << "Object a's pointer member dereferences a value of:\t" << a << endl;
    cout << "Object b's pointer member dereferences a value of:\t" << b << endl;

【问题讨论】:

  • 请发布您正在编译的实际代码。

标签: c++ templates stream overloading istream


【解决方案1】:

您是在声明您的运营商,而不是定义他们。模板定义与类中的定义无关,因为它们的原型不同,因此链接错误。将您的声明更改为:

template <typename T, typename Trait>
friend std::basic_ostream<T, Trait>&
operator<< (std::basic_ostream<T, Trait>& out, const MyClass& c)
{
    return out << c.my_val1;
}

template <typename T, typename Trait>
friend std::basic_istream<T, Trait>&
operator>> (std::basic_istream<T, Trait>& in, MyClass& c)
{
    return in >> *(c.my_val1);
}

请注意,它使用的是std::basic_ostreamstd::basic_istream,以及它们各自的类型和类型特征。它允许使用所有流,不仅是 std::ostreamstd::istream

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2018-04-17
    • 2012-05-10
    • 1970-01-01
    • 2011-05-07
    • 2011-05-13
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多