1

私はC++ 11で作業しており、同等のコードがいくつかあります

template<typename T1, typename T2>
auto add_func( const T1& lhs, const T2& rhs )
{
    return lhs + rhs;
}

floatand intasT1を使用してこのコードをコンパイルするT2と、変換によってデータが失われる可能性があるという警告が表示されますが、これは当然のことです。

私の問題は、この警告のすべてのインスタンスが行を指しているためreturn lhs + rhs;、警告がほとんど役に立たないことです。

テンプレート内ではなく、関数が呼び出された場所でこれらの警告を再スローする方法 (理想的には移植可能な方法) はありますか?

私はVisual Studio 2012で作業していますが、移植可能な方法が望ましいでしょう

編集:

より明確にするために、この警告は正しく、このコードの誤用が原因であることを知っています。問題は、そのような誤用が行われた場所をコンパイラに見つけてもらいたいということです。現在、この警告が表示された場合、 への各呼び出しを手動で検証する必要がありますが、これadd_funcはあまり維持できないようです。

これが今より理にかなっていることを願っています

4

2 に答える 2

2

コンパイラの警告システムにフックすることは、私には初心者のように思えます。代わりに、警告に関する詳細情報を見つける必要があるようです。

Visual Studio 内でビルドしていると仮定します。その場合は、[エラー リスト] から [出力] ウィンドウに切り替えると、次のように表示されます。

1>add_fun.cpp(31): warning C4244: 'return' : conversion from 'const float' to 'int', possible loss of data
1>          add_fun.cpp(38) : see reference to function template instantiation 'T1 add_func<int,float>(const T1 &,const T2 &)' being compiled
1>          with
1>          [
1>              T1=int,
1>              T2=float
1>          ]

ここで有効な行は、「add_fun.cpp(38) : 関数テンプレートのインスタンス化への参照を参照してください」であり、テンプレートがインスタンス化されている場所を示しています。

これは Visual C++ 固有のものですが、ほとんどのコンパイラは、完全なエラー テストに同様の情報を含める必要があります。

于 2013-05-22T06:06:41.073 に答える
2

残念ながら、あなたの問題を解決する簡単な方法はありません。この問題は、C++ テンプレートのメタプログラミングを使用する世代の開発者にとって本当に苦痛です。たとえば、標準アルゴリズムに対して生成された場合、まったく同じ警告が STL の根幹を指しているのを見ることができます。

しかし、c45207が適切に言及したように、実際の呼び出し行がコンパイラの出力で指定されているため、警告の原因が見つかる場合があります。そして、C++ 開発者は、テンプレートを扱う際にこれに精通している必要があると思います。

于 2013-05-22T07:01:17.513 に答える