|
1 | 1 | ---
|
2 | 2 | description: "Learn more about: Compiler Error C2993"
|
3 | 3 | title: "Compiler Error C2993"
|
4 |
| -ms.date: "11/04/2016" |
| 4 | +ms.date: "10/03/2023" |
5 | 5 | f1_keywords: ["C2993"]
|
6 | 6 | helpviewer_keywords: ["C2993"]
|
7 |
| -ms.assetid: 4ffd2b78-654b-46aa-95a6-b62101cf91c8 |
8 | 7 | ---
|
9 | 8 | # Compiler Error C2993
|
10 | 9 |
|
11 | 10 | 'identifier' : illegal type for non-type template parameter 'parameter'
|
12 | 11 |
|
13 |
| -You cannot declare a template with a structure or union argument. Use pointers to pass structures and unions as template parameters. |
| 12 | +- Prior to C++20, you cannot declare a template with a structure, class, or union argument. Pointers can be used in place of these types as template parameters. |
| 13 | +- Since C++20, structure, class, or unions *can* be used as non-type template parameters. A non-type template parameter can't be a rvalue reference type or a parameter pack of rvalue types. |
14 | 14 |
|
15 | 15 | The following sample generates C2993:
|
16 | 16 |
|
17 | 17 | ```cpp
|
18 |
| -// C2993.cpp |
19 |
| -// compile with: /c |
20 |
| -// C2993 expected |
21 |
| -struct MyStruct { |
22 |
| - int a;char b; |
23 |
| -}; |
24 |
| - |
25 |
| -template <class T, struct MyStruct S> // C2993 |
26 |
| - |
27 |
| -// try the following line instead |
28 |
| -// template <class T, struct MyStruct * S> |
29 |
| -class CMyClass {}; |
| 18 | +// compile with: /c and /std:c++17 |
| 19 | +template <int&& I> // C2993 |
| 20 | +struct S1 {}; |
| 21 | + |
| 22 | +template <int&&... Is> // C2993 |
| 23 | +struct S2 {}; |
| 24 | +``` |
| 25 | +
|
| 26 | +Before MSVC 19.26, the following code emitted C2993. It now emits C7582: |
| 27 | +
|
| 28 | +```cpp |
| 29 | +// compile with: /c /std:c++17 |
| 30 | +struct MyStruct {}; |
| 31 | +
|
| 32 | +template <class T, MyStruct S> // Was C2993 prior to MSVC 19.26. Now emits C7582. |
| 33 | +class MyClass1 {}; |
| 34 | +
|
| 35 | +template <class T, MyStruct* S> // OK |
| 36 | +class MyClass2 {}; |
30 | 37 | ```
|
31 | 38 |
|
32 |
| -This error will also be generated as a result of compiler conformance work that was done in Visual Studio .NET 2003: floating point non-type template parameters no longer allowed. The C++ standard does not allow floating point non-type template parameters. |
| 39 | +With C++17 and earlier, you can't have floating point non-type template parameters. Since C++20, floating point non-type template parameters are allowed. Use a function argument to pass the floating point non-type template parameter to function templates. |
33 | 40 |
|
34 |
| -If it is a function template, use a function argument to pass in the floating point non-type template parameter (this code will be valid in the Visual Studio .NET 2003 and Visual Studio .NET versions of Visual C++). If it is a class template, there is no easy workaround. |
| 41 | +Before MSVC 19.26, the following code emitted C2993. It now emits C7582: |
35 | 42 |
|
36 | 43 | ```cpp
|
37 | 44 | // C2993b.cpp
|
38 |
| -// compile with: /c |
39 |
| -template<class T, float f> void func(T) {} // C2993 |
| 45 | +// compile with: /c /std:c++17 |
| 46 | +template<class T, float F> // Was C2993 prior to MSVC 19.26. Now emits C7592 |
| 47 | +void func1(T t) {} |
40 | 48 |
|
41 |
| -// OK |
42 |
| -template<class T> void func2(T, float) {} |
| 49 | +template<class T> // OK |
| 50 | +void func2(T t, float F) {} |
43 | 51 | ```
|
0 commit comments