2016-04-24 54 views
1

這裏是我的代碼:如何告訴編譯器我的朋友的功能是函數模板

#include <iostream> 
#include <cstddef> 

class alloc 
{ 

}; 

template <class T, class Alloc = alloc, size_t BufSiz = 0> 
class deque 
{ 
public: 
    deque() { std::cout << "deque" << std::endl; } 
}; 

template <class T, class Sequence = deque<T> > 
class stack 
{ 
public: 
    stack() { std::cout << "stack" << std::endl; } 
private: 
    Sequence c; 
    friend bool operator== <> (const stack<T, Sequence>&, const stack<T, Sequence> &); 
    friend bool operator< <> (const stack<T, Sequence>&, const stack<T, Sequence>&); 
}; 

template <class T, class Sequence> 
bool operator== (const stack<T, Sequence>&x, const stack<T, Sequence>&y) 
{ 
    return std::cout << "opertor == " << std::endl; 
} 

template <class T, class Sequence> 
bool operator < (const stack<T, Sequence> &x, const stack<T, Sequence> &y) 
{ 
    return std::cout << "operator <" << std::endl; 
} 

int main() 
{ 
    stack<int> x; // deque stack 
    stack<int> y; // deque stack 

    std::cout << (x == y) << std::endl; // operator == 1 
    std::cout << (x < y) << std::endl; // operator < 1 
} 

我只是想簡單的<>符號告訴編譯器我的函數是函數模板。但我得到兩行錯誤:朋友只能是類或功能

friend bool operator== <> (const stack<T, Sequence>&, const stack<T, Sequence> &); 
friend bool operator< <> (const stack<T, Sequence>&, const stack<T, Sequence>&); 

我該怎麼做才能解決它。

回答

3

只要使用這個語法:

template<typename T1, typename Sequence1> 
friend bool operator== (const stack<T1, Sequence1>&, const stack<T1, Sequence> &); 

template<typename T1, typename Sequence1> 
friend bool operator< (const stack<T1, Sequence1>&, const stack<T1, Sequence>&); 

您內斯第一個模板參數是不同的T和第二比序列不同,否則你會被遮蔽的類的模板參數。

+0

是的,它的工作原理!謝謝〜 – Superxy