运算符的朋友特定模板实例化
Friend specific template instantiation of operator
我有一个 class 模板和一个需要访问其私有字段的运算符模板。我可以交个模板朋友:
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;
}
但是是否可以仅与 A<T>
交 operator==<T>
朋友而不与 A<double>
交 operator==<int>
朋友?
是的,你可以。语法如下:
template <typename T>
class A {
int x;
friend bool operator==<>(const A& a, const A& b);
};
并将您的 operator==
定义(或只是声明)放在 A
class 之前。
如果 friend
有问题,则在定义 A
class 之前提出声明。
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;
}
我有一个 class 模板和一个需要访问其私有字段的运算符模板。我可以交个模板朋友:
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;
}
但是是否可以仅与 A<T>
交 operator==<T>
朋友而不与 A<double>
交 operator==<int>
朋友?
是的,你可以。语法如下:
template <typename T>
class A {
int x;
friend bool operator==<>(const A& a, const A& b);
};
并将您的 operator==
定义(或只是声明)放在 A
class 之前。
如果 friend
有问题,则在定义 A
class 之前提出声明。
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;
}