MSVC 错误 C2971 常量 wchar_t * 作为模板参数

MSVC error C2971 for const wchar_t * as template argument

本文关键字:参数 C2971 错误 常量 wchar MSVC      更新时间:2023-10-16

我想在我的程序中添加一些关于参数的信息(类型和转换函数(。参数的名称是常量。我为它写了一些代码,但它无法在 MSVC 2017 中编译(在 GCC 或 Clang 上是可以的(

#include <iostream>
#include <string>
namespace params
{
    constexpr wchar_t CLIENT_LOGIN[] = L"ClientLogin";
    template<const wchar_t * ParamName>
    struct convert_traits
    {
    };
    template<>
    struct convert_traits<CLIENT_LOGIN>
    {
        using ConvertType = unsigned long long;
        static ConvertType convert(const std::wstring &str) 
        {
            return std::stoull(str);
        }
    };
}
int main() {
    std::cout << params::convert_traits<params::CLIENT_LOGIN>::convert(L"123.0") << std::endl;
    return 0;
}

我收到错误:

main.cpp(15): error C2971: 'params::convert_traits': template parameter 'ParamName': 'params::CLIENT_LOGIN': a variable with non-static storage duration cannot be used as a non-type argument
main.cpp(10): note: see declaration of 'params::convert_traits'
main.cpp(6): note: see declaration of 'params::CLIENT_LOGIN'
main.cpp(26): error C2971: 'params::convert_traits': template parameter 'ParamName': 'params::CLIENT_LOGIN': a variable with non-static storage duration cannot be used as a non-type argument
main.cpp(10): note: see declaration of 'params::convert_traits'
main.cpp(6): note: see declaration of 'params::CLIENT_LOGIN'

并且找不到 MSVC 的修复程序。

求解方式

extern const wchar_t CLIENT_LOGIN[] = L"ClientLogin";

但如果在标题中定义它,则不起作用。