将成员函数传递给模板函数时出现语法错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将成员函数传递给模板函数时出现语法错误相关的知识,希望对你有一定的参考价值。

首先,我使用C ++ 17标准。

我遇到问题的代码工作正常,除非我尝试在具有相同模板函数的类中使用它。

以下代码行:

    auto t = make_tuple_seq(std::make_index_sequence<numArgs>, &lzuint<T, A...>::helper);

导致像“t无法初始化”这样的10个编译错误,我坦率地看不出原因。

我以前的尝试是使用lambda函数而不是帮助成员函数,这也导致了不可读的错误。

这里我提供最少的代码:

#include <iostream>
#include <vector>
#include <functional>
#include <string>
#include <tuple>
template<typename _func, size_t... I>
auto make_tuple_seq(std::index_sequence<I...>, _func&& func)

    return std::make_tuple(func(I)...);

constexpr const auto numArgs = 2;
template<typename T, typename... A>
class lzuint

protected:
    size_t helper(size_t i)
    
        return this->body.size() - numArgs + i;
    
public:
    lzuint(const std::function<T(A...)>& func, A... args) : f(func), body( args... ) 

    const uint32_t& operator[](size_t index)
    
        auto t = make_tuple_seq(std::make_index_sequence<numArgs>, &lzuint<T, A...>::helper);
        while (body.size() - 1 < index)
            body.push_back(std::apply(f, std::move(t)));
        return body[index];
    
private:
    std::vector<T> body;
    std::function<T(A...)> f;
;
using ullong = unsigned long long;
int main()

    auto tup = make_tuple_seq(std::make_index_sequence<N>, [&v](size_t i) return v[i]; );//Note:this one works just fine
    lzuint<uint32_t, uint32_t, uint32_t> lzu([](uint32_t i, uint32_t j)  return i + j; , 1, 1);
    lzu[1];
    lzu[10];
    lzu[11];
    lzu[12];
    lzu[13];
    return 0;

任何帮助将不胜感激,因为我正在尝试通过创建类似于“懒惰评估”技术的模拟来了解可变参数模板。

我得到的第一个错误是

source.cpp(19): error C2064: term does not evaluate to a function taking 1 arguments
答案

lzuint<T, A...>::helper是一个非静态成员函数。它需要一个对象被调用。对象(它成为函数内部的this指针)通常作为隐藏的第一个参数传递,因此函数不带一个参数的消息。

有两种方法可以解决这个问题:使用lambdas

auto t = make_tuple_seq(std::make_index_sequence<numArgs>,
                        [this](size_t i)  return helper(i); );

或者使用std::bind

auto t = make_tuple_seq(std::make_index_sequence<numArgs>,
                        std::bind(&lzuint<T, A...>::helper, this, std::placeholders::_1));

使用lambdas通常是推荐的解决方案。

以上是关于将成员函数传递给模板函数时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 std::thread 将参数传递给函数时出现语法错误

使用 CreateThread 调用类函数时出现错误 C3867

将成员函数传递给函数指针

在 gcc 上将成员函数指针传递给模板成员函数时出现问题

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

是否可以直接将依赖于实例的成员函数(方法)从另一个成员函数传递给 STL 的算法?