这让我发疯了。我正在尝试将类型转换为字节和返回,我已经工作了。当我围绕我的方法构建函数时,我得到了模板推导错误,但我看不出它应该发生的任何原因。继承我的代码:
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
uint8_t *to_bytes(T &val) {
return reinterpret_cast<uint8_t *>(&val);
};
template<typename T>
T *from_bytes(uint8_t *bytes) {
return reinterpret_cast<T *>(bytes);
};
int main() {
double a = 10.4;
uint8_t *bytevals = to_bytes(a);
// "Send" the data out and receive it into an array
uint8_t bytes_rx[sizeof(a)];
for (int byt_ndx = 0; byt_ndx < sizeof(a); ++byt_ndx) {
bytes_rx[byt_ndx] = bytevals[byt_ndx];
}
double *thing_back;
thing_back = from_bytes(&bytes_rx[0]);
cout << *thing_back;
}
构建时的错误:
C:\Users\Peter\CLionProjects\CodingPractice\main.cpp: In function 'int main()':
C:\Users\Peter\CLionProjects\CodingPractice\main.cpp:31:41: error: no matching function for call to 'from_bytes(uint8_t*)'
thing_back = from_bytes(&bytes_rx[0]);
^
C:\Users\Peter\CLionProjects\CodingPractice\main.cpp:14:4: note: candidate: template<class T> T* from_bytes(uint8_t*)
T *from_bytes(uint8_t *bytes) {
^
C:\Users\Peter\CLionProjects\CodingPractice\main.cpp:14:4: note: template argument deduction/substitution failed:
C:\Users\Peter\CLionProjects\CodingPractice\main.cpp:31:41: note: couldn't deduce template parameter 'T'
thing_back = from_bytes(&bytes_rx[0]);
值得一提的是,如果我直接用函数中的代码替换函数调用,一切都运行良好。
答案 0 :(得分:3)
模板参数T
未在函数的参数中使用。因此,T
不能从用于调用它的参数中推断出来。
您需要明确模板参数。
thing_back = from_bytes<double>(&bytes_rx[0]);
如果您反对显式使用模板参数,则可以对函数使用伪参数。
template<typename T>
T *from_bytes(uint8_t *bytes, T* dummy) {
return reinterpret_cast<T *>(bytes);
};
并将其用作:
thing_back = from_bytes(&bytes_rx[0], things_back);