2017-04-15 53 views
-2

我想重载ostream和istream作为模板中的类的freind。我在网上看过,但一直没能找到很多关于模板重载的内容,我所看到的似乎也表明这是装载这些内容的方式。很显然,我对编程非常陌生,希望得到任何帮助。谢谢。重载插入和提取操作符作为模板

#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; 
+0

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

回答

0

你可以声明你的运营商,而不是定义它们。模板定义与您类内部的模板定义无关,因为它们的原型不同,因此链接错误。你的宣言改成这样:

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