没有foo调用的匹配函数

时间:2017-08-19 17:41:59

标签: c++ templates

为什么我收到以下代码的构建错误

编译器使用c ++ 14 xcode 8.3.3

#include <iostream>
#include <array>

template<typename T, typename U>

void foo(std::array<T,sizeof(U)> x,
         std::array<U,sizeof(T)> y,
         int z)
{

    puts(__PRETTY_FUNCTION__);
}

int main()
{

    foo(std::array<int,8>{},std::array<double,4>{},1);
    foo(std::array<int,9>{},std::array<double,4>{},2);

}

错误 第二次通话时出错

foo(std::array<int,9>{},std::array<double,4>{},2);

DEMO

g++ -std=c++1z -fconcepts -fgnu-tm  -O2 -Wall -Wextra -pedantic -pthread -pedantic-errors main.cpp -lm  -latomic -lstdc++fs && ./a.out
main.cpp: In function 'int main()':
main.cpp:18:14: error: could not convert 'std::array<int, 9>{}' from 'std::array<int, 9>' to 'std::array<int, 8>'
     foo(std::array<int,9>{},std::array<double,4>{},2);
              ^~~~~~~~~~~~~~
main.cpp: In instantiation of 'void foo(std::array<T, sizeof (U)>, std::array<U, sizeof (T)>, int) [with T = int; U = double]':
main.cpp:17:53:   required from here
main.cpp:6:34: warning: unused parameter 'x' [-Wunused-parameter]
 void foo(std::array<T,sizeof(U)> x,
                                  ^
main.cpp:7:34: warning: unused parameter 'y' [-Wunused-parameter]
          std::array<U,sizeof(T)> y,
                                  ^
main.cpp:8:14: warning: unused parameter 'z' [-Wunused-parameter]
          int z)
          ^

但如果只有一个电话就可以了

#include <iostream>
#include <array>


template<typename T, typename U>

void foo(std::array<T,sizeof(U)> x,
         std::array<U,sizeof(T)> y,
         int z)
{

    puts(__PRETTY_FUNCTION__);
}


int main()
{

    foo(std::array<int,8>{},std::array<double,4>{},1);
    //foo(std::array<int,9>{},std::array<double,4>{},2);

}

输出

void foo(std::array<T, sizeof(U)>, std::array<U, sizeof(T)>, int) [T = int, U = double]
Program ended with exit code: 0

2 个答案:

答案 0 :(得分:4)

你的问题在于:

foo(std::array<int,9>{},std::array<double,4>{},2);

为了理解错误,让我们尝试执行“编译器 - 作业”并尝试理解模板函数foo的调用方式。

所以

函数foo有两种类型可以推导:TU

当你使用该语句调用foo时,你传递了两个参数:

  • std::array<int, 9>
  • std::array<double, 4>

您的模板功能接受:

  • std::array<T,sizeof(U)> x
  • std::array<U,sizeof(T)> y

因此,很容易看到T被映射为intU被映射为double

推导出的功能将成为:

void foo(std::array<int, 8>,
         std::array<double, 4>,
         int);

因为可能在您的架构上sizeof(double) = 8sizeof(int) = 4(我刚刚替换了sizeof)。

因此您的调用错误,因为您的第一个参数是std::array<int, 9>而不是std::array<int, 8>

确实,你之前的电话:

foo(std::array<int,8>{},std::array<double,4>{},1);

编译。

答案 1 :(得分:2)

在运行macOS Sierra 10.12.6的Mac上使用GCC 7.2.0,我得到了错误(来自Y ~ RandomPredictor1 + RandomPredictor2中保存的问题的来源):

tf71.cpp

第二次调用的问题是$ g++ -O3 -g -std=c++11 -Wall -Wextra -Werror tf71.cpp -o tf71 tf71.cpp: In function ‘int main()’: tf71.cpp:18:14: error: could not convert ‘std::array<int, 9>{}’ from ‘std::array<int, 9>’ to ‘std::array<int, 8>’ foo(std::array<int,9>{},std::array<double,4>{},2); ^~~~~~~~~~~~~~ tf71.cpp: In instantiation of ‘void foo(std::array<T, sizeof (U)>, std::array<U, sizeof (T)>, int) [with T = int; U = double]’: tf71.cpp:17:53: required from here tf71.cpp:6:34: error: unused parameter ‘x’ [-Werror=unused-parameter] void foo(std::array<T,sizeof(U)> x, ^ tf71.cpp:7:34: error: unused parameter ‘y’ [-Werror=unused-parameter] std::array<U,sizeof(T)> y, ^ tf71.cpp:8:14: error: unused parameter ‘z’ [-Werror=unused-parameter] int z) ^ cc1plus: all warnings being treated as errors $ 不是第二个9double类型的大小,因此模板不匹配。这是一个不太可能的模板功能。

考虑到函数的主体和使用的编译选项,未使用的参数错误是不可避免的;他们与手头的问题相关。