2014-01-10 1 views
3

업데이트 3에서 AreEqual 형식 메시지 :어설 :: 한 줄

This page는 세 줄에서 작업을 수행하는 방법을 나에게 보여줍니다. 누구나 한 줄로 어떻게 처리 할 수 ​​있는지 알고 있습니까?

for (int i = 0; i < 5; i++) { 
    my_value_to_verify = get_my_values(i); 

    wchar_t message[200];        // Line 1 
    _swprintf(message, L"Value %d failed", i);   // Line 2 
    Assert::AreEqual(42, my_value_to_verify, message); // Line 3 
} 

업데이트 2

으로 내가 언급했던 문서는 C++/CLI에 대한 사실이었다 @JaredPar에 의해 지적했다. 추가 검색 후 the following link에는 내가 작업중인 기능에 대한 참조가 포함되어있는 것 같습니다.

Error: no instance of overloaded function ...AreEqual matches the argument list (int, int, const wchar_t[16], int) 

원래의 게시물을

내가 만들려고 Microsoft documentation 사용 : {난}에서 괄호도 여전히 컴파일 오류가 발생 제거

업데이트 1

형식화 된 메시지를 인쇄하는 Assert 문 예를 들면 다음과 같습니다.

for (int i = 0; i < 5; i++) { 
    my_value_to_verify = get_my_values(i); 
    Assert::AreEqual(42, my_value_to_verify, L"Value %d failed", {i}); 
} 

가능한 경우, assert 문에서 i 값을 인쇄하려고합니다. 마지막 매개 변수 "{i}"는 배열로되어 있습니다. 설명서의 내용을 따르려고합니다. 그러나 이렇게하면 컴파일 오류가 발생합니다.

(231): error C2143: syntax error : missing ')' before '{' 
(231): error C2059: syntax error : ')' 
(231): error C2143: syntax error : missing ';' before '{' 
(231): error C2143: syntax error : missing ';' before '}' 

메시지 서식을 지정하는 방법으로 배열을 선언하는 방법이 잘못되었습니다. 이 배열을 내 경우에 어떻게 선언해야합니까? Assert 선언문에서 처리 할 수 ​​있습니까?

답변

4

여러 가지 방법으로 호출 할 수 있습니다 끝은 이어야합니다. 람다 — str()은 원본 스트림의 내용을 복사하여 반환합니다. _s의 파괴가 있지만, c_str()은 내부 버퍼에 대한 포인터를 반환하므로 람다로부터의 복귀에서 살아남지 못할 것입니다.

int과 같은 프리미티브 유형뿐만 아니라 스트림이 사용되고 있기 때문에 제공된 메시지에 원하는 모든 객체를 넣을 수 있습니다. 해당하는 operator<< 오버로드가 있습니다.

0

여기에 i 값을 {}으로 묶을 필요는 없습니다. 단지 직접

Assert::AreEqual(42, my_value_to_verify, L"Value %d failed", i); 

... array<Object^>^...의 부분에있어서 그 위치에서 가변 인자를 수용하도록 지정되어 i를 사용한다.

#define MSG(msg) [&]{ std::wstringstream _s; _s << msg; return _s.str(); }().c_str() 

이처럼 사용 :

Assert::AreEqual(42, my_value_to_verify, MSG("Value " << i << " failed")); 

주를 c_str()에서 것을 따라서 당신은 당신이 매크로를 사용하여 괜찮다면

Assert::AreEqual(42, my_value_to_verify, L""); 
Assert::AreEqual(42, my_value_to_verify, L"%d%d", 1, 2); 
+0

컴파일러는 그 중 하나를 좋아하지 않습니다. "오류 : 오버로드 된 함수의 인스턴스가 없습니다 ... 인수 목록과 일치합니다 ...". – dtmland

+0

@dtmland는 C++ 또는 C++/CLI를 사용하고 있습니다. 당신의 샘플 코드에서 알기가 어렵다 – JaredPar

+0

현재 C++ – dtmland