テンプレート ライブラリがあり、そのコンパイルで警告が表示されないことに不満を持っていると思います。#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
テンプレート引数に依存しないことに注意してください。
確実に行う唯一の方法は、テンプレートを特化して関数を呼び出すことです。それを行うコードは、そのためにアクセス可能である必要がないことに注意してください ( のようにWarningMachine
)。これは、最適化によって除外される候補になります (ただし、場合によって異なります)。また、関数に渡される値は、コードは決して実行されないため、有効な値です (これにより、配列の割り当てや、関数が必要とする可能性のあるデータの準備を省くことができます)。
一方で、実際にすべての関数をチェックするには多くのコードを書かなければならないので、有効なデータを渡して結果の正確性をチェックし、それを有用なものにすることもできます。あなたの後にコードを書いてください(上記の場合のように)。