You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/error-messages/compiler-errors-2/compiler-error-c2993.md
+17-24Lines changed: 17 additions & 24 deletions
Original file line number
Diff line number
Diff line change
@@ -4,56 +4,49 @@ title: "Compiler Error C2993"
4
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, class or union argument. However, pointers can be used in place of those types as template parameters. Since C++20, structure, class or unions can be used as non-type 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 cannot be a rvalue reference type. Neither is a parameter pack of rvalue types allowed.
14
14
15
15
The following sample generates C2993:
16
16
17
17
```cpp
18
-
// C2993.cpp
18
+
// compile with: /c and /std:c++17
19
+
template <int&& I> // C2993
20
+
structS1 {};
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
19
29
// compile with: /c /std:c++17
20
30
struct MyStruct {};
21
31
22
-
template <class T, MyStruct S> // C2993
32
+
template <class T, MyStruct S> // Was C2993 prior to MSVC 19.26. Now emits C7582.
23
33
class MyClass1 {};
24
34
25
35
template <class T, MyStruct* S> // OK
26
36
class MyClass2 {};
27
37
```
28
38
29
-
> [!NOTE]
30
-
> The sample above no longer emits C2993 since MSVC v19.26 and instead shows C7592.
31
-
32
39
With C++17 and earlier, you cannot have floating point non-type template parameters. Since C++20, floating point non-type template parameters are allowed as with literal class types.
40
+
If it's a function template, use a function argument to pass the floating point non-type template parameter.
33
41
34
-
If it is a function template, use a function argument to pass in the floating point non-type template parameter.
42
+
Before MSVC 19.26, the following code emitted C2993. It now emits C7582:
35
43
36
44
```cpp
37
45
// C2993b.cpp
38
46
// compile with: /c /std:c++17
39
-
template<class T, float F> // C2993
47
+
template<classT, float F> // Was C2993 prior to MSVC 19.26. Now emits C7592
40
48
void func1(T t) {}
41
49
42
50
template<classT> // OK
43
51
void func2(T t, float F) {}
44
52
```
45
-
46
-
> [!NOTE]
47
-
> The sample above no longer emits C2993 since MSVC v19.26and instead shows C7592.
48
-
49
-
Non-type template parameters cannot be of rvalue reference type. Similarly, a parameter pack of such types are not allowed.
0 commit comments