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
'identifier' : illegal type for non-type template parameter 'parameter'
12
12
13
-
You cannot declare a template with a structureor union argument. Use pointers to pass structures and unions as template parameters.
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.
14
14
15
15
The following sample generates C2993:
16
16
17
17
```cpp
18
18
// C2993.cpp
19
-
// compile with: /c
20
-
// C2993 expected
21
-
structMyStruct {
22
-
int a;char b;
23
-
};
19
+
// compile with: /c /std:c++17
20
+
structMyStruct {};
24
21
25
-
template <class T, struct MyStruct S> // C2993
22
+
template <class T, MyStruct S> // C2993
23
+
class MyClass1 {};
26
24
27
-
// try the following line instead
28
-
// template <class T, struct MyStruct * S>
29
-
class CMyClass {};
25
+
template <class T, MyStruct* S> // OK
26
+
class MyClass2 {};
30
27
```
31
28
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.
29
+
> [!NOTE]
30
+
> The sample above no longer emits C2993 since MSVC v19.26 and instead shows C7592.
31
+
32
+
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.
33
33
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.
34
+
If it is a function template, use a function argument to pass in the floating point non-type template parameter.
35
35
36
36
```cpp
37
37
// C2993b.cpp
38
+
// compile with: /c /std:c++17
39
+
template<class T, float F> // C2993
40
+
void func1(T t) {}
41
+
42
+
template<class T> // OK
43
+
void func2(T t, float F) {}
44
+
```
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