/ / C ++ Метод на избиране на шаблон в клас, който не е от шаблон от самия клас - c ++, шаблони

C ++ Метод за избиране на шаблон в клас без шаблон от самия клас - c ++, шаблони

class Node {
public:
template<class T>  T*   GetComponent() {
return new T(this);  // actual code is more complicated!
}

Transform*   Transform() {
return this->GetComponent<Transform>();   // invalid template argument for "T", type expected
}
};

Но призоваването на същия метод работи от друго място! като основен (). Какво не е наред с този код!

Отговори:

1 за отговор № 1

Кодът, който сте предоставили, има грешки, както вече споменахме. След като ги фиксирате, ще получите грешката, която споменахте.

Причината да го получите е, че имате членна функция с име Transform, същото като типа, който искате да конкретизирате GetComponent за. Така че, решението е да "помага" на компилатора, като използва пълно име на тип, включително пространство на имена. Това предполага това Transform се дефинира в глобално пространство на имена:

Transform*   Transform() {
return this->GetComponent<::Transform>();
}

Използвайте това, ако сте го определили в имена:

Transform*   Transform() {
return this->GetComponent<::YOUR_NAMESPACE::Transform>();
}

EDIT: пълният код, който използвах:

class Node;
class Transform
{
public:
Transform(Node*);
};

class Node {
public:
template <class T>
T*   GetComponent() {
return new T(this);
}

Transform*   Transform() {
return this->GetComponent<::Transform>();
}
};