Udostępnij za pośrednictwem


Błąd kompilatora C2955

"identifier" : użycie szablonu klasy lub aliasu ogólnego wymaga szablonu lub ogólnej listy argumentów

Nie można użyć szablonu klasy lub klasy ogólnej jako identyfikatora bez szablonu lub ogólnej listy argumentów.

Aby uzyskać więcej informacji, zobacz Szablony klas.

Poniższy przykład generuje kod C2955 i pokazuje, jak go naprawić:

// C2955.cpp
// compile with: /c
template<class T>
class X {};

X x1;   // C2955
X<int> x2;   // OK - this is how to fix it.

C2955 może również wystąpić podczas próby definicji poza wierszem dla funkcji zadeklarowanej w szablonie klasy:

// 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 może również wystąpić w przypadku używania typów ogólnych:

// C2955_c.cpp
// compile with: /clr
generic <class T>
ref struct GC {
   T t;
};

int main() {
   GC^ g;   // C2955
   GC <int>^ g;
}

Przykład

Program Visual Studio 2017 lub nowszy: kompilator poprawnie diagnozuje brakujące listy argumentów szablonu, gdy szablon pojawi się na liście parametrów szablonu (na przykład jako część domyślnego argumentu szablonu lub parametr szablonu innego niż typ). Poniższy kod kompiluje się w programie Visual Studio 2015, ale generuje błąd w programie 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;