C2338 compile error for a Microsoft Visual Studio unit test

c++, unit-testing, visual-studio-2013, vs-unit-testing-framework, windows

Solution

I managed to resolve the issue by adding the following code into my unit test class file:

/* ToString specialisation */
namespace Microsoft
{
    namespace VisualStudio
    {
        namespace CppUnitTestFramework
        {
            template<> static std::wstring ToString<struct HINSTANCE__>
                (struct HINSTANCE__ * t)
            { 
                RETURN_WIDE_STRING(t);
            }
        }
    }
}

I based this on the contents of CppUnitTestAssert.h (which is where the compilation error occurs - double clicking on the compilation error will open this file for you).

Near the top of the file (and only a few lines down if you double clicked on the compilation error as noted above) you can see a set of `ToString` templates. I copied one of these lines and pasted it into my test class file (enclosed in the same namespaces as the original templates).

I then simply modified the template to match the compilation error (specifically `<struct HINSTANCE__>(struct HINSTANCE__ * t)`).

For my scenario, using `RETURN_WIDE_STRING(t)` is sufficient in displaying a mismatch in my `AreSame` assertion. Depending on the type used you could go further and pull out some other meaningful text.

Problem

I am receiving the following error when I attempt to compile a unit test in Visual Studio 2013: Error 1 error C2338: Test writer must define specialization of ToString<Q* q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<struct HINSTANCE__>(struct HINSTANCE__ *). You can replicate the error by having a test method such as below: ``` const std::wstring moduleName = L"kernel32.dll"; const HMODULE expected = GetModuleHandle(moduleName.c_str()); Microsoft::VisualStudio::CppUnitTestFramework::Assert::AreEqual(expected, expected); ``` Does anyone know how I need to go about writing such a specialization of `ToString`?

Original source