virtual
이 클래스 템플릿 멤버 함수에 허용되지 않는 경우 다음 코드가 작동합니까?이 가상 멤버 함수 템플릿입니까?
template <typename T>
class Test {
public:
virtual ~Test() {}
virtual void Func(const T&) {}
};
virtual
이 클래스 템플릿 멤버 함수에 허용되지 않는 경우 다음 코드가 작동합니까?이 가상 멤버 함수 템플릿입니까?
template <typename T>
class Test {
public:
virtual ~Test() {}
virtual void Func(const T&) {}
};
이 구문을 사용하는 경우 코드는 컴파일되지 않습니다 :이 가상 함수로 의미가 동적 다형성을 허용하는 런타임에 묶여있다되지 않았지만 함수 템플릿 한 경우가로 의미있어
template <typename T> virtual Func(const T&){}
을 컴파일시에 인스턴스화됩니다 (정적 다형성). 함수가 템플릿이 아니므로 템플릿 클래스 내에서 가상으로 선언 할 수 있습니다.
당신은 virtual
멤버 함수 (더 here를) 템플릿 수 없습니다. 가지고있는 것은 virtual
멤버 함수를 가진 템플릿 클래스입니다.
...
virtual
이 클래스 템플릿 멤버 함수에 허용되지 않는다면?
나는 여기에 문제가 용어 모호성 생각 :
클래스 템플릿 내부 virtual
기능을 완벽하게 허용된다. 사실 Test<T>
을 서브 클래스 화하고 Test<T>
에 대한 포인터를 통해 서브 클래스의 인스턴스를 삭제하려는 경우 Test<T>
의 소멸자가 virtual
인 요구 사항 일 수 있습니다. 자세한 논의는 When to use virtual destructors?을 참조하십시오.
할 수없는 일은 기능 템플릿 가상입니다. 그것은 다른 혼란을 설명하기 위해 이미 어떤 유효한이고 것이 아니다 설명 당신은 어떤 대답을 가지고 Can a C++ class member function template be virtual?
볼 수 있지만, 내가 말하려고하자 :
"클래스 템플릿 멤버 함수를"모호합니다. 클래스 템플릿의 멤버 함수를 의미하거나 클래스의 템플릿 멤버 함수를 의미 할 수 있습니다. 전자는 virtual
일 수 있습니다 (템플릿 멤버 함수가 아닌 한). 후자는 사용할 수 없습니다.
누군가가 virtual
을 클래스 템플릿 멤버 함수에 사용할 수 없다고 주장하고 클래스의 템플릿 멤버 함수를 의미하는 것처럼 보였지만 다른 방식으로 해석했습니다.
왜 허용되지 않습니까? '클래스 Foo : public 테스트 {};' –
juanchopanza