2016-05-15 4 views
4

У меня есть шаблон шаблона и шаблон оператора, которому необходимо получить доступ к его частному полю. Я могу сделать друг шаблона:Конкретный экземпляр экземпляра оператора для конкретного оператора

template <typename T> 
class A { 
    int x; 
    template <typename U> 
    friend bool operator==(const A<U>& a, const A<U>& b); 
}; 

template <typename T> 
bool operator== (const A<T>& a, const A<T>& b) { 
    return a.x == b.x; 
} 

int main() { 
    A<int> x, y; 
    x == y; 
    return 0; 
} 

Но это можно сделать только operator==<T> друг для A<T> и не делает operator==<int> друга A<double>?

ответ

6

Если у вас возникли проблемы с friend, введите объявление вперед, прежде чем будет определен класс A.

template <typename T> 
bool operator== (const A<T>& a, const A<T>& b); 

Тогда вы можете friend его более четко. Полное решение (ideone):

template <typename T> 
class A; 

// declare operator== early (requires that A be introduced above) 
template <typename T> 
bool operator== (const A<T>& a, const A<T>& b); 

// define A 
template <typename T> 
class A { 
    int x; 
    // friend the <T> instantiation 
    friend bool operator==<T>(const A<T>& a, const A<T>& b); 
}; 

// define operator== 
template <typename T> 
bool operator== (const A<T>& a, const A<T>& b) { 
    return a.x == b.x; 
} 
2

Да, вы можете. Синтаксис выглядит следующим образом:

template <typename T> 
class A { 
    int x; 
    friend bool operator==<>(const A& a, const A& b); 
}; 

И поставить operator== определение (или просто заявление) до A класса.

+2

не похоже на работу http://ideone.com/vnu3QR – RiaD

+0

Это не ошибка компилятора. Есть места, где этот синтаксис действителен, но это не один из них. –

+0

@AlanStokes, ну да, этот синтаксис здесь полностью применим. Почему бы вам не попробовать себя? Просто поставьте 'operator ==' перед классом. – ixSci

Смежные вопросы