Перегрузка шаблона CString ToString () для CppUnitTestFramework - PullRequest
0 голосов
/ 02 апреля 2019

Как написать перегрузку шаблона CppUnitTestFramework ToString () для C ++ строки C ++ VS2012?Это должно быть возможно.

Компилятор говорит, что должен, поскольку выдает ошибку компиляции:

error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > >>(const class ATL::CStringT<unsigned short,class StrTraitMFC<unsigned short,class ATL::ChTraitsCRT<unsigned short> > > &).

Noramlly для других типов данных Я добавляю что-то похожее на этот код моего модульного теста:

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace Microsoft { namespace VisualStudio { namespace CppUnitTestFramework {
    template<> static std::wstring ToString<eNumy>(const eNumy & e) {   return ltots(static_cast<long>(e)); }

Я пытался добавить:

template<> static std::wstring ToString<CString>(const CString & e) { return e.GetBuffer(); }

Но это не компилируется с постоянными проблемами:

error C2663: 'ATL::CSimpleStringT<BaseType>::GetBuffer' : 2 overloads have no legal conversion for 'this' pointer

У кого-нибудь есть идеи?

Я хочу запустить этот тест:

CString csTina;
CString csGeoff;
Assert::AreNotEqual(csTina, csGeoff);

1 Ответ

1 голос
/ 02 апреля 2019

Да, там у вас это есть: Функция CString GetBuffer не помечена как функция const, поэтому вы не можете вызвать эту функцию для const CString&.

Несколько вариантов:

  • Снять const с перегрузки.
  • Реализация логики без GetBuffer.
  • Сделайте const_cast, чтобы получить его. ( НЕ рекомендуется, хотя).
  • Просто преобразуйте CString в std::string (или std::wstring) и используйте существующие функции.
...