假设我有几个这样定义的函数:
template <typename T>
inline void read<bool>(T **data) {
//some code
}
template <typename T>
inline void read<double>(T **data) {
//some other code
}
template <typename T>
inline void read<int>(T **data) {
//also different code
}
现在,我创建另一个定义如下的函数:
template<typename T>
inline void readMultiple(T **data, int counter) {
for (int i = 0; i < counter, ++i) {
read<T>(data);
}
}
(1)那将根据类型T调用适当的read<T>(T **data)
实现,对吗?
(2)如果我要指定的类型不是上述三种类型之一,我会收到编译错误,因为没有定义该函数,对吧?
(3)另外,我可以拨打这个电话:
double **d;
read<double>(d);
确保我调用double的实现?
我知道在没有<double>
部分的情况下我会得到相同的结果,但是这样我确保将double传递给函数,而没有<double>
的情况允许{ {1}}成为d
或int
,代码仍会编译,无声地引入错误。
答案 0 :(得分:1)
(1)那将根据类型T调用适当的
read<T>(T **data)
实现,对吗?
是的,假设在遇到read<T>(data)
时可以看到专业化。
(2)如果我要指定的类型不是上述三种类型之一,我会收到编译错误,因为该函数未定义,对吧?
您尚未提供模板read()
功能的声明,因此无法解答此问题。假设您已将其声明为template <typename T> void read(T**);
并且未在任何地方定义,那么是,you would get a link-time error当链接器无法找到所请求的专业化的实现时。
(3)另外,我可以拨打这个电话:
double **d; read<double>(d);
确保我调用double的实现?
你可以,<double>
是多余的,并且会被推断出来。
......默默地引入错误。
如果你传递的内容是bool**
,那么使用bool
专业化会 错误 。我没有真正看到明确提供模板参数的任何好处。如果bool**
是错误的类型,那么无论如何你可能会在其他地方遇到错误。
我想这取决于你的意思&#34;默默地引入一个错误。&#34;目前尚不清楚您试图阻止的错误类型。我可以想出一个人为的例子,但人为的例子很少代表现实世界的危险。
两个旁注:
template <> inline void read<bool>(bool **data) { /* ... */ }
。