使用函数指针和引用进行模板参数推导

发布于 2024-11-18 13:11:11 字数 789 浏览 1 评论 0原文

可能的重复:
为什么在推导模板参数时会删除模板参数的限定符输入?

考虑以下 C++ 代码:

void f(int&);

template <typename T> void tpl(void (*)(T), T);

void bar(int& x)
{
        tpl(&f, x);
}

使用 GCC 4.6.0 进行编译失败,并显示以下错误消息:

fntpl.cpp: In function ‘void bar(int&)’:
fntpl.cpp:7:11: error: no matching function for call to ‘tpl(void (*)(int&), int&)’
fntpl.cpp:7:11: note: candidate is:
fntpl.cpp:3:46: note: template<class T> void tpl(void (*)(T), T)

如果我明确声明模板参数(tpl(&f, x)),它有效。为什么模板参数推导在这种情况下不起作用?

Possible Duplicate:
Why are qualifiers of template arguments stripped when deducing the type?

Consider the following C++ code:

void f(int&);

template <typename T> void tpl(void (*)(T), T);

void bar(int& x)
{
        tpl(&f, x);
}

Compilation using GCC 4.6.0 fails with the following error message:

fntpl.cpp: In function ‘void bar(int&)’:
fntpl.cpp:7:11: error: no matching function for call to ‘tpl(void (*)(int&), int&)’
fntpl.cpp:7:11: note: candidate is:
fntpl.cpp:3:46: note: template<class T> void tpl(void (*)(T), T)

If I state the template parameters explicitely (tpl<int&>(&f, x)), it works. Why doesn't template argument deduction work in this case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

热情消退 2024-11-25 13:11:11

因为它们根本不同

void f(int&);

,并且

void (*)(T)

编译器仅推断出 Tint,因此它会查找:

void f(int);

这与您的意图完全不同,请将函数指针更改为此:

template <typename T> void tpl(void (*)(T&), T);

并且编译器会很高兴...

Because these are fundamentally different

void f(int&);

and

void (*)(T)

the compiler has only deduced that T is int, so it looks for:

void f(int);

which is nothing like your intention, change the function pointer to this:

template <typename T> void tpl(void (*)(T&), T);

And the compiler will be happy...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文