整数和常量字符[N]上的模板未编译(无法推断模板参数"N")
Templates on integers and const char[N] aren't compiling (couldn't infer template argument 'N')
为什么编译器不能在下面的代码中推断模板参数?我如何修复代码?我想添加尽可能低的运行时开销。
#include <iostream>
using namespace std;
struct Test
{
template<int N>
Test(const char data[N]) :
data(data),
size(N)
{}
const char *data;
int size;
};
int main()
{
Test test("Foobar");
return 0;
}
我试图使代码片段尽可能的小和可读。
pos-reply更新:
c++ K-ballo故事中的解释可能会有用:
左值转换,当在需要右值的上下文中使用左值参数时应用。这些转换是左值到右值的转换, 数组到指针的转换,以及函数到指针的转换。这是按值传递时应用于所有函数实参的类型转换,通常称为实参衰减。
您需要通过引用接受参数:
Test(const char (&data)[N] )
现在将推断N
在你的例子中,参数被value接受,当它被传递给构造函数时,会导致数组衰减为指向数组第一个元素的指针。
相关文章:
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- C++模板-基于参数编译成员函数
- 无法使用模板参数编译提升元状态机
- lambda 和映射,引用参数 - 编译错误
- 为什么在函数参数编译中没有标识符的const关键字
- 无法使用模板参数编译类
- 数组作为函数参数 - 编译错误
- 使用 "using declaration" 扩展非类型模板参数包(模板可变参数编译时 SignalSlot 实现)
- 在 gcc 中使用数组参数编译外部"c"代码
- 为什么对齐的参数编译正确,但在运行时崩溃
- GCC上的亚型参考参数编译错误
- 是否可以将addr2line与使用发布优化参数编译的应用程序一起使用
- 尝试使用可变参数编译代码时出错
- C++ 线程获取引用参数编译失败
- 使用额外的模板参数编译函数
- 使用静态模板函数的默认参数编译错误
- 函数模板参数编译错误
- 谷歌模拟成员函数中的std::pair参数编译失败
- 模板模板参数-编译错误
- 防止基于模板参数编译函数(或部分函数)