Partilhar via


Erro do compilador C2993

«identificador» : tipo ilegal para o parâmetro de modelo não tipo «parâmetro»

Observações

  • Antes do C++20, você não pode declarar um modelo com um argumento de estrutura, classe ou união. Ponteiros podem ser usados no lugar desses tipos como parâmetros de modelo.
  • Desde o C++20, estrutura, classe ou uniões podem ser usadas como parâmetros de modelo não tipo. Um parâmetro de modelo não-tipo não pode ser um tipo de referência rvalue ou um pacote de parâmetros de tipos rvalue.

Examples

O exemplo a seguir gera C2993:

// compile with: /c and /std:c++17
template <int&& I>   // C2993
struct S1 {};

template <int&&... Is>   // C2993
struct S2 {};

Antes do MSVC 19.26, o código a seguir emitia C2993. Ele agora emite C7582:

// compile with: /c /std:c++17
struct MyStruct {};

template <class T, MyStruct S>   // Was C2993 prior to MSVC 19.26. Now emits C7582.
class MyClass1 {};

template <class T, MyStruct* S>   // OK
class MyClass2 {};

Com o C++17 e versões anteriores, não é possível ter parâmetros de modelo sem tipo de ponto flutuante. Desde o C++20, parâmetros de modelo sem tipo de ponto flutuante são permitidos. Use um argumento de função para passar o parâmetro de modelo não-tipo de ponto flutuante para modelos de função.

Antes do MSVC 19.26, o código a seguir emitia C2993. Ele agora emite C7582:

// C2993b.cpp
// compile with: /c /std:c++17
template<class T, float F>   // Was C2993 prior to MSVC 19.26. Now emits C7592
void func1(T t) {}

template<class T>   // OK
void func2(T t, float F) {}