请问为什么编译器推断不出这里的 Nontype Template Parameter(非类型模板参数?)呢?

2016-01-12 00:11:53 +08:00
 jmc891205

用的编译器是 clang-700.1.81

#include <iostream>
using namespace std;

template <unsigned N, unsigned M>
void compare(const char p1[N], const char p2[M]) {
  cout << N << ", " << M << endl;
}
int main() {
  compare("hi", "hello");
  return 0;
}

错误信息是:

test.cpp:9:3: error: no matching function for call to 'compare'
  compare("hi", "hello");
  ^~~~~~~
test.cpp:5:6: note: candidate template ignored: couldn't infer template argument
      'N'
void compare(char p1[N], char p2[M]) {
     ^
1 error generated.

请问这里为什么编译器推断不出 N 为 3, M 为 6 呢?
但是如果参数是用引用,那就可以了。

#include <iostream>
using namespace std;

template <unsigned N, unsigned M>
void compare(const char (&p1)[N], const char (&p2)[M]) {
  cout << N << ", " << M << endl;
}
int main() {
  compare("hi", "hello");
  return 0;
}
800 次点击
所在节点    C
3 条回复
yangff
2016-01-12 00:28:01 +08:00
大概是类型?

void fuck(const char p1[3]) {
cout << typeid(p1).name();
}
msg7086
2016-01-12 00:30:47 +08:00
帮你用 gcc 跑了一下,得出以下错误信息:

test.cpp:5:6: note: candidate: template<unsigned int N, unsigned int M> void compare(const char*, const char*)
void compare(const char p1[N], const char p2[M]) {
^

所以很明显不是引用的时候变成了 const char * 了。
jmc891205
2016-01-12 11:47:59 +08:00
@msg7086 谢谢!我明白了~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/250011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX