2010-02-10 3 views
0

클래스의 유닛 테스트에서 빈 생성자를 명시 적으로 호출하여 클래스 변수를 선언하고 인터페이스에 대한 참조를 제외한 함수로 전달하려고합니다. 선언하고있는 유형의 컴파일러가 오류를 생성합니다. 명시 적 생성자를 호출하지 않고 선언하면 함수는이를 받아들입니다. 컴파일러가 나에게 전화를 허용하지 않습니다 왜에 의해 혼란 스러워요컴파일 오류 : 객체 참조를 사용하는 함수 매개 변수가 생성 된 객체에 혼동 됨

error: no matching function for call to `CClassUnderTest::Run(CTestController (&)())' error: candidates are: unsigned int CClassUnderTest::Run(IController&)

:

//classundertest.h 
class IController; 

class CClassUnderTest 
{ 
public: 
    CClassUnderTest() {} 
    virtual ~CClassUnderTest() {} 

    unsigned int Run(IController & controller); 
}; 

//testclassundertest.h 
#include "UnitTest++.h" 

#include "classundertest.h" 
#include "icontroller.h" 

class CTestController : public IController 
{ 
public: 
    CTestController() : IController() {} 
    virtual ~CTestController() {} 

    virtual void Play(unsigned int i) {} 
}; 

struct CClassUnderTestFixture 
{ 
    CClassUnderTest classUnderTest; 
}; 

TEST_FIXTURE(CClassUnderTestFixture, RunTest) 
{ 
    CTestController controllerA; 

    CHECK_EQUAL(classUnderTest.Run(controllerA), 105U); 

    CTestController controllerB(); 

    CHECK_EQUAL(classUnderTest.Run(controllerB), 105U); 
} 

컴파일러는 controllerB이 생성자의 참조입니다 믿고

아래 코드를 참조하십시오 생성자가 controllerB를 인스턴스화 할 때, 특히 프로덕션 코드가 이걸로 괜찮 으면?

답변

6

이 줄 :

CTestController controllerB(); 

아무것도 필요하지 않으며 CTestController을 반환하는 함수의 선언입니다. 기본 구성의 경우 괄호를 생략해야합니다.

이것은 "가장 난감한 구문 분석"과 관련이 있습니다. 고려 :

struct S {}; 

int main() 
{ 
    S s(S()); // copy construct a default-constructed S ...? 
} 

이것은 작동하지 않습니다. 이것은 s을 아무 것도 취하지 않고 S를 반환하는 함수로 선언하는 함수로 선언합니다.이 문제를 해결하려면 여분의 괄호 세트를 사용할 수 있습니다.

struct S {}; 

int main() 
{ 
    S s((S())); // copy construct a default-constructed S :) 
} 
관련 문제