运算符的朋友特定模板实例化

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;
}