forward
私は趣味として競技プログラミングをしている高校生です。最近、データの出入力において、cin/cout よりも scanf/printf の方が速いということを知りました。しかし、変換指定子は各クラスによって異なるためコードを打ち込む際の時間短縮やタイプミス対策のため、Visual Studio を用いて新たに入出力用の関数(?)を作ることにしました。
code
C++
1 2#include <iostream> 3#include <cstdio> 4#include <cstdint> 5#include <cinttypes> 6 7struct in 8{ 9 template<typename T> in& operator>>(T& val) { std::cin >> val; return *this; } 10 in& operator>>(char& val) { std::scanf(" %c", &val); return *this; } 11 in& operator>>(std::int_fast8_t& val) { std::scanf("%" SCNdFAST8, &val); return *this; } 12 in& operator>>(std::uint_fast8_t& val) { std::scanf("%" SCNuFAST8, &val); return *this; } 13 in& operator>>(std::int_fast16_t& val) { std::scanf("%" SCNdFAST16, &val); return *this; } 14 in& operator>>(std::uint_fast16_t& val) { std::scanf("%" SCNuFAST16, &val); return *this; } 15 in& operator>>(std::int_fast32_t& val) { std::scanf("%" SCNdFAST32, &val); return *this; } 16 in& operator>>(std::uint_fast32_t& val) { std::scanf("%" SCNuFAST32, &val); return *this; } 17 in& operator>>(std::int_fast64_t& val) { std::scanf("%" SCNdFAST64, &val); return *this; } 18 in& operator>>(std::uint_fast64_t& val) { std::scanf("%" SCNuFAST64, &val); return *this; } 19 in& operator>>(float& val) { std::scanf("%f", &val); return *this; } 20 in& operator>>(double& val) { std::scanf("%lf", &val); return *this; } 21}; 22 23struct out 24{ 25 template<typename T> out& operator<<(T& val) { std::cout << val; return *this; } 26 out& operator<<(char& val) { std::printf("%c", val); return *this; } 27 out& operator<<(std::int_fast8_t& val) { std::printf("%" PRIdFAST8, val); return *this; } 28 out& operator<<(std::uint_fast8_t& val) { std::printf("%" PRIuFAST8, val); return *this; } 29 out& operator<<(std::int_fast16_t& val) { std::printf("%" PRIdFAST16, val); return *this; } 30 out& operator<<(std::uint_fast16_t& val) { std::printf("%" PRIuFAST16, val); return *this; } 31 out& operator<<(std::int_fast32_t& val) { std::printf("%" PRIdFAST32, val); return *this; } 32 out& operator<<(std::uint_fast32_t& val) { std::printf("%" PRIuFAST32, val); return *this; } 33 out& operator<<(std::int_fast64_t& val) { std::printf("%" PRIdFAST64, val); return *this; } 34 out& operator<<(std::uint_fast64_t& val) { std::printf("%" PRIuFAST64, val); return *this; } 35 out& operator<<(float& val) { std::printf("%f", val); return *this; } 36 out& operator<<(double& val) { std::printf("%lf", val); return *this; } 37}; 38 39// ex) int_fast16_t i; に対して in() >> i; out() << i; -> 疑似 cin/cout 40
error
Wandbox (C++ gcc HEAD 9.0.0 20181227 (experimental)) で返ってきたエラーです。
prog.cc:14:6: error: 'in& in::operator>>(int_fast32_t&)' cannot be overloaded with 'in& in::operator>>(int_fast16_t&)' 14 | in& operator>>(std::int_fast32_t& val) { std::scanf("%" SCNdFAST32, &val); return *this; } | ^~~~~~~~ prog.cc:12:6: note: previous declaration 'in& in::operator>>(int_fast16_t&)' 12 | in& operator>>(std::int_fast16_t& val) { std::scanf("%" SCNdFAST16, &val); return *this; } | ^~~~~~~~ prog.cc:15:6: error: 'in& in::operator>>(uint_fast32_t&)' cannot be overloaded with 'in& in::operator>>(uint_fast16_t&)' 15 | in& operator>>(std::uint_fast32_t& val) { std::scanf("%" SCNuFAST32, &val); return *this; } | ^~~~~~~~ prog.cc:13:6: note: previous declaration 'in& in::operator>>(uint_fast16_t&)' 13 | in& operator>>(std::uint_fast16_t& val) { std::scanf("%" SCNuFAST16, &val); return *this; } | ^~~~~~~~ prog.cc:16:6: error: 'in& in::operator>>(int_fast64_t&)' cannot be overloaded with 'in& in::operator>>(int_fast16_t&)' 16 | in& operator>>(std::int_fast64_t& val) { std::scanf("%" SCNdFAST64, &val); return *this; } | ^~~~~~~~ prog.cc:12:6: note: previous declaration 'in& in::operator>>(int_fast16_t&)' 12 | in& operator>>(std::int_fast16_t& val) { std::scanf("%" SCNdFAST16, &val); return *this; } | ^~~~~~~~ prog.cc:17:6: error: 'in& in::operator>>(uint_fast64_t&)' cannot be overloaded with 'in& in::operator>>(uint_fast16_t&)' 17 | in& operator>>(std::uint_fast64_t& val) { std::scanf("%" SCNuFAST64, &val); return *this; } | ^~~~~~~~ prog.cc:13:6: note: previous declaration 'in& in::operator>>(uint_fast16_t&)' 13 | in& operator>>(std::uint_fast16_t& val) { std::scanf("%" SCNuFAST16, &val); return *this; } | ^~~~~~~~ prog.cc:30:7: error: 'out& out::operator<<(int_fast32_t&)' cannot be overloaded with 'out& out::operator<<(int_fast16_t&)' 30 | out& operator<<(std::int_fast32_t& val) { std::printf("%" PRIdFAST32, val); return *this; } | ^~~~~~~~ prog.cc:28:7: note: previous declaration 'out& out::operator<<(int_fast16_t&)' 28 | out& operator<<(std::int_fast16_t& val) { std::printf("%" PRIdFAST16, val); return *this; } | ^~~~~~~~ prog.cc:31:7: error: 'out& out::operator<<(uint_fast32_t&)' cannot be overloaded with 'out& out::operator<<(uint_fast16_t&)' 31 | out& operator<<(std::uint_fast32_t& val) { std::printf("%" PRIuFAST32, val); return *this; } | ^~~~~~~~ prog.cc:29:7: note: previous declaration 'out& out::operator<<(uint_fast16_t&)' 29 | out& operator<<(std::uint_fast16_t& val) { std::printf("%" PRIuFAST16, val); return *this; } | ^~~~~~~~ prog.cc:32:7: error: 'out& out::operator<<(int_fast64_t&)' cannot be overloaded with 'out& out::operator<<(int_fast16_t&)' 32 | out& operator<<(std::int_fast64_t& val) { std::printf("%" PRIdFAST64, val); return *this; } | ^~~~~~~~ prog.cc:28:7: note: previous declaration 'out& out::operator<<(int_fast16_t&)' 28 | out& operator<<(std::int_fast16_t& val) { std::printf("%" PRIdFAST16, val); return *this; } | ^~~~~~~~ prog.cc:33:7: error: 'out& out::operator<<(uint_fast64_t&)' cannot be overloaded with 'out& out::operator<<(uint_fast16_t&)' 33 | out& operator<<(std::uint_fast64_t& val) { std::printf("%" PRIuFAST64, val); return *this; } | ^~~~~~~~ prog.cc:29:7: note: previous declaration 'out& out::operator<<(uint_fast16_t&)' 29 | out& operator<<(std::uint_fast16_t& val) { std::printf("%" PRIuFAST16, val); return *this; } | ^~~~~~~~
problem
非常に長いエラーですが、今回問題となっているのは**「int(NN)_t型は <cstdint> で typedef されているだけなので、クラスの衝突が発生してしまう」**という点です。基本形を使えば済む話ではあるのですが、どうにかして int(NN)_t型を用いたコードを作りたいのです。多重定義を回避する方法、もしくはこの関数(?)を成立させる方法をご教示いただけると幸いです。
supplementation
コードを修正するためgoogle 先生に頼り、「サイズ別に整数型を多重定義したかった - イグトランスの頭の中」->「整数型の大きさで関数をオーバーロードする方法 - Qiita」のサイトを見させていただきました。しかし、プログラミング経験の浅い私には内容が把握しきれませんでした。もし私がより C++ に精通していれば、何かしらのヒントになっていたと思います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/29 16:34 編集
2018/12/29 17:08
2018/12/30 02:56