c++ - 静态友元模板函数出现“无重载函数实例”错误
问题描述
我有一个类A
试图调用非成员函数DoTheThing
。DoTheThing
是类的朋友,A
因此它可以调用 的私有成员函数TheThing
。是一个模板函数,因此它可以调用多个用户定义的类。因为错误引用了一个重载的函数,我相信我正在重新定义within ,但我无法弄清楚如何修复这个错误。A
DoTheThing
TheThing
DoTheThing
A
#include <iostream>
#include <vector>
template<typename Component>
requires requires (std::vector<double>& vec, int i) {Component::TheThing(vec, i); }
static void DoTheThing(std::vector<double>& vec, int i) {
Component::TheThing(vec, i);
}
class A {
template<class Component>
friend void DoTheThing(std::vector<double>& vec, int i);
public:
A() {
vec_.resize(10, 5);
DoTheThing<A>(vec_, 7); // Error: no instance of overloaded function
}
private:
static void TheThing(std::vector<double>& vec, int i) {
vec[i] = vec[i] * i;
}
std::vector<double> vec_;
};
我在重新定义DoTheThing
吗?如何让非会员DoTheThing
成为朋友A
?如何调用DoTheThing
的构造函数A
?
解决方案
您没有friend
使用特别的 requires 子句来限制声明,因此您实际上并没有将友谊授予DoTheThing
您想要的相同功能。您还需要requires
在声明中复制该子句friend
:
class A {
template<class Component>
requires requires (std::vector<double>& vec, int i) {Component::TheThing(vec, i); }
friend void DoTheThing(std::vector<double>& vec, int i);
// ...
};
这是一个演示。
但是,你应该命名这个概念,使用会更简单:
template<typename Component>
concept CanDoThing = requires (std::vector<double>& vec, int i) {
Component::TheThing(vec, i);
};
template<CanDoThing Component>
static void DoTheThing(std::vector<double>& vec, int i) {
Component::TheThing(vec, i);
}
class A {
template<CanDoThing Component>
friend void DoTheThing(std::vector<double>& vec, int i);
// ...
};
推荐阅读
- authentication - 来自钥匙串的 Swift 4 WKWebView 身份验证
- html - 如何使用 Android 应用程序从网页的 html 内容中提取数据?
- amazon-web-services - 为什么我的 EC2 实例工作了一段时间然后就宕机了?
- git - git commit 将文件从暂存区移动/复制到本地分支
- wix - Wix 安装程序 - 我可以按部分执行启动条件吗?
- laravel - laravel eloquent hasmany 或 hasmany 槽
- c++ - 当我们没有用空字符显式初始化字符数组时,字符串的长度是多少?
- android - 为什么没有显示滚动视图中的所有内容?
- javascript - 如何在组件中添加 CanDeactivate 功能?
- javascript - 替代循环内部 for ... of 和 while(true)