gpt4 book ai didi

c++ - 将函数作为参数传递给模板类的模板方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:05 25 4
gpt4 key购买 nike

下面的代码看起来合法但不能编译

void f() {}

template<bool>
struct call_any
{
template<typename F>
static void call(F f) {}
};

template<bool B>
void call_f()
{
call_any<true>::call<void (&)()>(f); // OK
call_any<false>::call<void (&)()>(f); // OK
call_any<B>::call<void()>(f); // OK
call_any<B>::call<void (&)()>(f); // expected primary-expression before '>'
}

为什么会出错,这是什么意思?

最佳答案

当您处理依赖于模板中的模板参数的类型时,编译器不知道该类型的成员是什么类型的东西。除非您另有说明,否则它假定成员不是类型也不是模板。正因为如此,它正在努力治疗<作为小于运算符,但当它到达 > 时,就不可能以这种方式解析表达式.

要消除错误,您应该改用它:

call_any<B>::template call<void (&)()>(f);

这明确地告诉编译器 call是一个模板,所以它应该处理 <作为模板参数的开头,而不是常规的小于运算符。

这应该使用 template还有:

call_any<B>::call<void()>(f); 

您没有在这一行看到错误的唯一原因是有一种方法可以将其解析为非模板:

(call_any<B>::call < void() ) > (f);

虽然很奇怪,但它在语法上是有效的,所以编译器越过那一行,你看到的第一个错误就是你提到的错误。但是,没有 template关键字,你最终会得到一次错误 call_f实际上是实例化的(可能 - 它可以以奇怪的方式工作)。

前两个示例在不使用 template 的情况下是可以的关键词。由于类型不依赖于模板参数,因此可以确定 call是一个模板,而 call_f正在解析。

您可能会问:“为什么编译器不能确定它是一个模板?我已经在上面的代码中将它定义为模板了!”。问题是特化。您可以专门化模板并执行与主模板指定完全不同的操作:

template<>
struct call_any<false>
{
static const int call = 5;
};

这种特化甚至可以在 call_f 之后发生已定义,因此编译器不能依赖于 call_any 的主要模板。解析时说 call_f .

关于c++ - 将函数作为参数传递给模板类的模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17480111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com