首页 > 解决方案 > 静态友元模板函数出现“无重载函数实例”错误

问题描述

我有一个类A试图调用非成员函数DoTheThingDoTheThing是类的朋友,A因此它可以调用 的私有成员函数TheThing。是一个模板函数,因此它可以调用多个用户定义的类。因为错误引用了一个重载的函数,我相信我正在重新定义within ,但我无法弄清楚如何修复这个错误。ADoTheThingTheThingDoTheThingA

#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

标签: c++templatesfriend-function

解决方案


您没有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);
// ...
};

推荐阅读