Ошибка компилятора C2955
identifier: для использования шаблона класса или универсального псевдонима требуется список аргументов шаблона или универсальный список аргументов
Шаблон класса или универсальный класс нельзя использовать в качестве идентификатора без списка аргументов шаблона или универсального списка аргументов.
Дополнительные сведения см. в разделе "Шаблоны классов".
В следующем примере показано возникновение ошибки C2955 и приводятся сведения по ее устранению.
// C2955.cpp
// compile with: /c
template<class T>
class X {};
X x1; // C2955
X<int> x2; // OK - this is how to fix it.
Ошибка C2955 также может возникать при попытке определить вне строки функцию, объявленную в шаблоне класса:
// 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() {}
Ошибка C2955 также может возникнуть при использовании универсальных шаблонов:
// C2955_c.cpp
// compile with: /clr
generic <class T>
ref struct GC {
T t;
};
int main() {
GC^ g; // C2955
GC <int>^ g;
}
Пример
Visual Studio 2017 и более поздних версий: компилятор правильно диагностировать отсутствующие списки аргументов шаблона, когда шаблон отображается в списке параметров шаблона (например, в составе аргумента шаблона по умолчанию или параметра шаблона, отличного от типа). Следующий код компилируется в Visual Studio 2015, но выводит ошибку в 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;