템플릿 기능을 만드는 것이 가능하다는 것을 알고 있습니다.
template<typename T>
void DoSomeThing(T x){}
템플릿 클래스를 만들 수 있습니다.
template<typename T>
class Object
{
public:
int x;
};
그러나 템플릿 내에 클래스가 아닌 클래스를 만든 다음 해당 클래스의 함수를 템플릿으로 만들 수 있습니까? 즉 :
//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
template<class T>
void DoX(){}
};
또는 클래스가 템플릿의 일부가 아니지만 기능이있는 정도까지?
답변
당신의 추측은 맞습니다. 당신이 기억해야 할 유일한 것은 멤버 함수 템플릿이다 정의 는 않지만 (선언 이외에)이, 헤더 파일이 아닌 CPP에 있어야 하지 클래스 선언 자체의 본문에 있어야합니다.
답변
여기 참조 : 템플릿 , 템플릿 메서드 , 멤버 템플릿, 멤버 함수 템플릿
class Vector
{
int array[3];
template <class TVECTOR2>
void eqAdd(TVECTOR2 v2);
};
template <class TVECTOR2>
void Vector::eqAdd(TVECTOR2 a2)
{
for (int i(0); i < 3; ++i) array[i] += a2[i];
}
답변
예, 템플릿 멤버 함수는 여러 경우에 완벽하게 합법적이고 유용합니다.
유일한 경고는 템플릿 멤버 함수가 가상 일 수 없다는 것입니다.
답변
가장 쉬운 방법은 선언과 정의를 같은 파일에 넣는 것이지만 크기가 큰 실행 파일이 발생할 수 있습니다. 예 :
class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}
또한 템플릿 정의를 별도의 파일에 넣을 수 있습니다. 즉, .cpp 및 .h 파일에 넣을 수 있습니다. 템플릿 인스턴스화를 .cpp 파일에 명시 적으로 포함하기 만하면됩니다. 예 :
// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}
// .cpp file
//...
template <typename T> void Foo::some_method(T t)
{//...}
//...
template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);