2014-12-25 1 views
0

virtual이 클래스 템플릿 멤버 함수에 허용되지 않는 경우 다음 코드가 작동합니까?이 가상 멤버 함수 템플릿입니까?

template <typename T> 
class Test { 

public: 

    virtual ~Test() {} 
    virtual void Func(const T&) {} 
}; 
+2

왜 허용되지 않습니까? '클래스 Foo : public 테스트 {};' – juanchopanza

답변

3

이 구문을 사용하는 경우 코드는 컴파일되지 않습니다 :이 가상 함수로 의미가 동적 다형성을 허용하는 런타임에 묶여있다되지 않았지만 함수 템플릿 한 경우가로 의미있어

template <typename T> virtual Func(const T&){} 

을 컴파일시에 인스턴스화됩니다 (정적 다형성). 함수가 템플릿이 아니므로 템플릿 클래스 내에서 가상으로 선언 할 수 있습니다.

3

당신은 virtual 멤버 함수 (더 here를) 템플릿 수 없습니다. 가지고있는 것은 virtual 멤버 함수를 가진 템플릿 클래스입니다.

4

... virtual이 클래스 템플릿 멤버 함수에 허용되지 않는다면?

나는 여기에 문제가 용어 모호성 생각 :

  • 클래스 템플릿 내부 virtual 기능을 완벽하게 허용된다. 사실 Test<T>을 서브 클래스 화하고 Test<T>에 대한 포인터를 통해 서브 클래스의 인스턴스를 삭제하려는 경우 Test<T>의 소멸자가 virtual 인 요구 사항 일 수 있습니다. 자세한 논의는 When to use virtual destructors?을 참조하십시오.

  • 할 수없는 일은 기능 템플릿 가상입니다. 그것은 다른 혼란을 설명하기 위해 이미 어떤 유효한이고 것이 아니다 설명 당신은 어떤 대답을 가지고 Can a C++ class member function template be virtual?

4

볼 수 있지만, 내가 말하려고하자 :

"클래스 템플릿 멤버 함수를"모호합니다. 클래스 템플릿의 멤버 함수를 의미하거나 클래스의 템플릿 멤버 함수를 의미 할 수 있습니다. 전자는 virtual 일 수 있습니다 (템플릿 멤버 함수가 아닌 한). 후자는 사용할 수 없습니다.

누군가가 virtual을 클래스 템플릿 멤버 함수에 사용할 수 없다고 주장하고 클래스의 템플릿 멤버 함수를 의미하는 것처럼 보였지만 다른 방식으로 해석했습니다.