다음 템플릿 정의는함수 포인터 및 함수 객체를 일반 코드로 묶는 방법은 무엇입니까?
template <typename Func, typename ReturnType, typename... Arguments>
class Command
{
public:
Command(Func f) : m_func(f) { }
ReturnType operator()(Arguments... funcArgs) { return m_func(funcArgs...); }
private:
Func m_func;
};
에 오류 메시지를 제공 GCC 4.7.3 (오류 : 필드 '명령 :: m_func'을 잘못 선언 된 함수 타입) 다음과 같은 테스트 코드로 인스턴스화 :
void testFunction(int i, double d)
{
std::cout << "TestFunctor::operator()(" << i << ", " << d << ") called." << std::endl;
}
int main()
{
void (&fRef)(int, double) = TestFunction;
Command<void(int, double), void, int, double> testCommand(fRef);
}
또한 오류 메시지는 주소 연산자가없는 TestFunction을 testCommand 생성자에 전달할 때 발생하지만 명시 적으로 명명 된 함수 포인터를 전달하거나 주소 연산자를 사용하여 매개 변수를 전달하면 사라집니다. 나는이 코드가 Modern C++ Design의 Chapter 5에서 주어진대로 동작해야한다고 생각합니다.
함수에 대한 참조를 저장할 수없는 이유는 무엇입니까?하지만 함수 포인터는 정상적으로 작동합니까? 펑터를 Command의 생성자에 인수로 전달할 수 있다는 지원을 잃지 않고 컴파일 할 수있는 해결 방법이 있습니까?