我想你有一个模板库,你抱怨它的编译没有警告。不要寻找糟糕的#include
路径,那最终会成为错误。不幸的是,如果没有专门化(除非模板被.cpp
. 考虑一下:
#include <vector>
template <class C>
struct T {
bool pub_x(const std::vector<int> &v, int i)
{
return v.size() < i;
}
bool pub_y(const std::vector<int> &v, int i)
{
return v.size() < i;
}
};
typedef T<int> Tint; // will not help
bool pub_z(const std::vector<int> &v, unsigned int i) // if signed, produces warning
{
return v.size() < i;
}
class WarningMachine {
WarningMachine() // note that this is private
{
//T<int>().pub_y(std::vector<int>(), 10); // to produce warning for the template
}
};
int main()
{
//Tint().pub_y(std::vector<int>(), 10); // to produce warning for the template
return 0;
}
您可以在codepad中尝试一下。请注意pub_z
,尽管从未被调用,但编译时会立即产生有符号/无符号比较警告。不过,对于模板来说,情况就完全不同了。即使T::pub_y
被调用,T::pub_x
仍然毫无预警地通过。这取决于编译器的实现,一旦所有信息都可用,一些编译器会执行更积极的检查,而其他编译器往往是懒惰的。请注意,既不依赖T::pub_x
也不T::pub_y
依赖于模板参数。
可靠地做到这一点的唯一方法是专门化模板并调用函数。请注意,执行此操作的代码不需要可访问(例如 in WarningMachine
),使其成为优化的候选对象(但这取决于),并且还意味着传递给函数的值可能不需要有效值,因为代码永远不会运行(这将节省您分配数组或准备函数可能需要的任何数据)。
另一方面,由于您将不得不编写大量代码来真正检查所有功能,因此您最好传递有效数据并检查结果的正确性并使其有用,而不是让任何阅读的人感到困惑你之后的代码(在上述情况下很可能)。