2017-05-10 6 views
1

max(int、size_t)を呼び出すコードがたくさんあります。 このエラーを抑制する賢明な方法はありますか?それは、最大で動作するので、エラーを抑制するmax(size_t&、int)

それは愚かなの一種である(整数、0)

私はこれを行うさせて頂いております:size_t i = 0;

#include <algorithm> 

int main() 
{ 
    size_t i = 2; 
    size_t m = std::max(i, size_t(2)); 
    // size_t m = std::max(i, 2); error: no matching function for call to 'max(size_t&, int)' 

} 
+0

代替は、異なるタイプの引数を受け取り、「正しい」の一般的なタイプを(それがマクロで行われた同様にいるかのように)返す独自のmaxを書くことです'static_cast'は機能スタイルのキャストではありません)、いくつかのオプションがあります。すでに提案されているように、 'i'をintに変更すると、明示的なテンプレートパラメータ' max (i、2) 'を提供します。これはunsigned longリテラル' max(i、2UL) 'を使用することもできます。システム)。 –

+1

C++は '2'が' size_t'型であるとコンパイラに指示するリテラルサフィックスを提供していないので、このキャストはおそらくあなたができる最良のものです( '2'を名前定数 - もう1つの選択肢)。そのような目的のための機能的またはCスタイルのキャストは、扱いにくい 'static_cast'よりも適切です。 – AnT

+0

@AnT:まあ、 'size_t演算子" "_st(unsigned long long x){return x; } '。接尾辞_predefined_はありません。 – MSalters

答えて

3

は、一般的に、私はstd::max<size_t>(i, 2)を好みます。 (実際には、明示的なキャストはないので、より面白い警告を黙らせるかもしれません)、引数リストが乱雑にならないようにします。別にキャスト(使用から

template<typename T, typename U> 
auto my_max(T t, U u) -> decltype(1?t:u){ 
    return t>u?t:u; 
} 
関連する問題