函数的可选模板化参数
Optional templated parameters for a function
我在要使用的类中有一个函数,其定义是:
template <typename T>
class FooClass
{
/* [...] */
public:
template <typename TT>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
}
我试着这样称呼它:
obj.myFunction(a, b, c, d);
所有参数都与他们应该具有的类型匹配。
但是,Visual Studio 在编译时抛出一个错误:
C2783 : could not deduce template argument for TT
但是如果我尝试以这种方式调用该函数,它会编译而不会出错:
obj.myFunction(a, b, c, d, 0);
我的问题是,为什么我不能在没有可选参数的情况下调用该函数?怎么做?
默认
参数无法完成模板参数推导; TT
无法推断。
无法从函数默认参数的类型推导出类型模板参数
您可以显式指定模板参数:
obj.myFunction<int>(a, b, c, d);
或者也为模板参数TT
默认类型。
template <typename TT = T>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
请注意,您仍然可以为其显式指定类型。
所有模板参数(例如 TT
(应该在调用的位置知道,以便了解函数内部的TT
。
如果调用函数的所有参数,编译器会看到第四个参数的类型是TT
,因此可以推断出TT
是什么。 例如,如果它是零,则TT = int
。
另一方面,如果只指定三个参数,编译器完全不知道TT
应该是什么。因此,它无法选择- is it
myFunction 调用哪个版本的myFunction
,
myFunction or even
myFunction'?
如果你想要一些TT
的"默认"值,你应该明确地指定:
template <typename TT = int>
void myFunction(int a, FooClass& b, int c,
int d, TT optional_e = static_cast<TT>(1));
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类