【问题标题】:C2975 invalid template argument for 'N', expected compile-time constant expressionC2975“N”的模板参数无效,预期的编译时常量表达式
【发布时间】:2016-01-10 11:12:28
【问题描述】:

这是一种代码 sn-p 应该在 7.1 (VS 2003) 左右的版本上运行。

我无法在 Visual Studio 2013 上编译它。

.h header:

template <HINSTANCE h, DWORD hash, class N>
inline LPVOID testFunc(N n1)
{   
    ...
    return ret_func(n1);
}


.cpp:

HINSTANCE kernel32;

int WINAPI WinMain(...)
{
    ...
    kernel32 = GetKernel32();  
    HINSTANCE mod = testFunc<kernel32, 0x0BADC0DE>("some_string");  // C2975
    ...
}

错误 C2975:“h”:“testFunc”的模板参数无效,预期的编译时常量表达式

我试过这样:

HINSTANCE kernel32 = GetKernel32();  // implemented ok
HINSTANCE mod = testFunc<kernel32, 0x0BADC0DE>("some_string");  // C2971

错误 C2971:“pushargEx”:模板参数“h”:“kernel32”:局部变量不能用作非类型参数

【问题讨论】:

  • "some_string"const char[],而不是类。
  • 在此上下文中的类意味着“某种类型”而不是通常意义上的类。
  • @Wimmel 所以?它有一个类型。
  • @Wimmel: 不,class 可以,相当于typename
  • 非类型参数类型必须是整型或者指针类型,更别说其他错误了

标签: c++ templates visual-c++ compiler-errors


【解决方案1】:

错误实际上是不言自明的:

预期的编译时常数表达式

kernel32 不是。

“编译时常数”表示该值必须在编译时已知,即。 e.在源代码本身中指定(直接或间接)。

【讨论】:

    【解决方案2】:

    kernel32 不是编译时间常数。它需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多