为什么我收到以下代码的构建错误
编译器使用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);
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
答案 0 :(得分:4)
你的问题在于:
foo(std::array<int,9>{},std::array<double,4>{},2);
为了理解错误,让我们尝试执行“编译器 - 作业”并尝试理解模板函数foo
的调用方式。
所以
函数foo
有两种类型可以推导:T
和U
。
当你使用该语句调用foo
时,你传递了两个参数:
std::array<int, 9>
std::array<double, 4>
您的模板功能接受:
std::array<T,sizeof(U)> x
std::array<U,sizeof(T)> y
因此,很容易看到T
被映射为int
而U
被映射为double
。
推导出的功能将成为:
void foo(std::array<int, 8>,
std::array<double, 4>,
int);
因为可能在您的架构上sizeof(double) = 8
和sizeof(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
$
不是第二个9
中double
类型的大小,因此模板不匹配。这是一个不太可能的模板功能。
考虑到函数的主体和使用的编译选项,未使用的参数错误是不可避免的;他们与手头的问题相关。