C++ 运算符^重载类型为‘;无效’;和‘&书信电报;未解析的重载函数类型>’;错误

C++ 运算符^重载类型为‘;无效’;和‘&书信电报;未解析的重载函数类型>’;错误,c++,operator-overloading,C++,Operator Overloading,我在下面的代码中遇到了这个错误。我不知道怎样才能解决这个问题。我尝试了多种方法,比如使函数无效、自动或lambda函数释放函数。我试了所有的 invalid operands of types ‘void’ and ‘<unresolved overloaded function type>’ to binary ‘operator|’ 145 | student & func | OUTPUT; | ~~~~~~~~~~~~~~~^~~~~~~ 会更

我在下面的代码中遇到了这个错误。我不知道怎样才能解决这个问题。我尝试了多种方法,比如使函数无效、自动或lambda函数释放函数。我试了所有的

 invalid operands of types ‘void’ and ‘<unresolved overloaded function type>’ to binary ‘operator|’
  145 |  student & func | OUTPUT;
      |  ~~~~~~~~~~~~~~~^~~~~~~
会更有意义


请注意,传递
OUTPUT
不会按您期望的方式工作。操作员
^
需要一个函数,而
输出
是一个函数模板。您需要使用functor或接受模板作为模板参数。

运算符不会返回任何内容。这有点奇怪。你不能使用
void
作为函数的参数,因此你的操作符(返回
void
)是不可链接的。在没有
调用参数
的情况下使用模板函数的名称是很棘手的,而且只允许在一些非常特殊的情况下使用。要获得所需的语法,可能
输出
应该是具有成员函数模板
操作符()
的类类型对象的名称。
emplate<typename Container, typename FuncObj>
auto take( Container cont, FuncObj fobj){
    Container result;
    for(const auto& item: cont){
        if(fobj(item)){
            result.push_back(item);
        }
    }
    return result;
}
template<typename T>
auto OUTPUT (T t){
    print(t);
}


template<typename Container ,typename FuncObj>
auto operator &(const Container& variable, const FuncObj& fobj){
    take(variable, fobj);

}

template<typename Container,typename FuncObj>
auto operator ^(const Container& container, const FuncObj& fobj){
    for(auto item: container){
        fobj(item);
    }
}



student & func ^ OUTPUT;
template<typename Container ,typename FuncObj>
auto operator &(const Container& variable, const FuncObj& fobj){
    take(variable, fobj);

}
template<typename Container ,typename FuncObj>
auto operator &(const Container& variable, const FuncObj& fobj){
    return take(variable, fobj);
}