Erro do compilador C2955
'identificador' : o uso de modelo de classe ou alias genérico requer um modelo ou uma lista de argumentos genéricos
Você não pode usar um modelo de classe ou uma classe genérica como um identificador sem um modelo ou uma lista de argumentos genéricos.
Para saber mais, confira Modelos de classe.
O seguinte exemplo gera o erro C2955 e mostra como corrigi-lo:
// C2955.cpp
// compile with: /c
template<class T>
class X {};
X x1; // C2955
X<int> x2; // OK - this is how to fix it.
O C2955 também pode ocorrer ao se tentar uma definição fora de linha para uma função declarada em um modelo de classe:
// C2955_b.cpp
// compile with: /c
template <class T>
class CT {
public:
void CTFunc();
void CTFunc2();
};
void CT::CTFunc() {} // C2955
// OK - this is how to fix it
template <class T>
void CT<T>::CTFunc2() {}
O C2955 também pode ocorrer ao usar genéricos:
// C2955_c.cpp
// compile with: /clr
generic <class T>
ref struct GC {
T t;
};
int main() {
GC^ g; // C2955
GC <int>^ g;
}
Exemplo
Visual Studio 2017 e posterior: o compilador diagnostica corretamente listas de argumentos de modelo ausentes quando o modelo é exibido em uma lista de parâmetros de modelo (por exemplo, como parte de um argumento de modelo padrão ou um parâmetro modelo que não é um tipo). O código a seguir é compilado no Visual Studio 2015, mas produz um erro no Visual Studio 2017.
template <class T> class ListNode;
template <class T> using ListNodeMember = ListNode<T> T::*;
template <class T, ListNodeMember M> class ListHead; // C2955: 'ListNodeMember': use of alias
// template requires template argument list
// correct: template <class T, ListNodeMember<T> M> class ListHead;