0

私のコードでは、クラス ByteArray (単なるバイトのベクトル) のストリーム演算子をオーバーロードしました。

// myfile.hpp
using ByteArray_t = std::vector<uint8_t>;

std::ostream &operator<<(std::ostream &os, const ByteArray_t &array);
...

// myfile.cpp
std::ostream &operator<<(std::ostream &os, const ByteArray_t &array) {... return os;}

およびtest.cppこのクラスを使用する using Catch2

TEST_CASE("Oh-my", "[...]") {
  ByteArray_t frame = create(max_val); // write the bytes of max val into the array

  INFO(frame); // Print frame if test fails (uses '<<' operator)

  REQUIRE(...);
}

名前空間を導入しない限り、これはうまくいきました


namespace mw {
// myfile.hpp
using ByteArray_t = std::vector<uint8_t>;

std::ostream &operator<<(std::ostream &os, const ByteArray_t &array);
} // namespace mw
...

// myfile.cpp
namespace mw {
std::ostream &operator<<(std::ostream &os, const ByteArray_t &array) {... return os;}
}  // namespace mw

今、コンパイラは不平を言います

 error: invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>') and 'const std::vector<unsigned char, std::allocator<unsigned char> >')
            *m_oss << value;
            ~~~~~~ ^  ~~~~~
.../include/catch2/catch.hpp:2629:22: note: in instantiation of function template specialization 'Catch::ReusableStringStream::operator<<<std::vector<unsigned char, std::allocator<unsigned char> > >' requested here
            m_stream << value;
tests.cpp:69:15: note: in instantiation of function template specialization 'Catch::MessageBuilder::operator<<<std::vector<unsigned char, std::allocator<unsigned char> > >' requested here
  **INFO(frame);**

ただし、で使用するframestd::cout、これは正常に機能します

  INFO(frame);                // <== Compiler error
  std::cout << frame << '\n'; // <== OK

したがって、コンパイラは演算子を適切に解決できると思います。また、インクルード ファイルの順序を変更し、クリーンなリビルドを試みましたが、成功しませんでした。

何か案は?ありがとう

4

1 に答える 1