首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >特定于朋友的操作符模板实例化

特定于朋友的操作符模板实例化
EN

Stack Overflow用户
提问于 2016-05-15 09:01:36
回答 2查看 85关注 0票数 4

我有一个类模板和一个操作符模板,需要访问它的私有字段。我可以交一个模板朋友:

代码语言:javascript
运行
复制
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>交友,而不为A<double>operator==<int>交友?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-15 09:21:31

如果friend有问题,那么在定义A类之前,将声明向前推进。

代码语言:javascript
运行
复制
template <typename T>
bool operator== (const A<T>& a, const A<T>& b);

然后,您可以更清楚地friend它。完全解决方案(ideone):

代码语言:javascript
运行
复制
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;
}
票数 6
EN

Stack Overflow用户

发布于 2016-05-15 09:08:26

是的你可以。语法如下:

代码语言:javascript
运行
复制
template <typename T>
class A {
    int x;
    friend bool operator==<>(const A& a, const A& b);
};

并将您的operator==定义(或仅仅是一个声明)放在A类之前。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37236354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档