【发布时间】:2021-11-01 00:25:38
【问题描述】:
虽然这个问题看起来有点令人困惑。代码很简单:
template <typename T>
void tfunc(T&& getter)
{
}
template <typename T = void>
void voidfunc()
{}
int main() {
tfunc(&voidfunc); // error: could not deduce template argument for 'T'
tfunc(&voidfunc<int>); // ok
voidfunc(); // calling using default template parameter is ok.
}
clang 11 和 msvc visual studio 2019 16.7 都报错。 为什么我需要显式指定模板参数?
背景
- 该参数是一个虚拟参数,只是为了将
voidfunc的实例化延迟到使用它的位置。类型并不重要。 -
&voidfunc被clangAST生成的一些代码使用,否则我需要调整生成器以编写&voidfuc<>,如果它是一个模板。 -
__declspec(property(put=voidfunc))这个 clang/msvc 扩展需要voidfunc而不是voidfunc<>
如果给定的函数是模板,我已经调整了生成器以输出 @Jarod42 所说的 &voidfunc<>。它现在有效。
【问题讨论】:
-
tfunc(&voidfunc<>);如果你想使用默认值也可以。 -
请在问题中包含完整的错误消息。这里没有错误godbolt.org/z/oaKfsxfnd(虽然这可能是 gccs 错误)
-
@463035818_is_not_a_number clang 和 msvc 都抱怨错误我已经更新了问题
-
voidfunc是函数模板,没有指向函数模板的指针。 -
@Evg 没有,但有[temp.deduct.funcaddr]。
标签: c++ templates c++17 language-lawyer c++20