为什么模板参数推导/替换失败?

时间:2017-04-08 07:41:17

标签: c++ templates

这让我发疯了。我正在尝试将类型转换为字节和返回,我已经工作了。当我围绕我的方法构建函数时,我得到了模板推导错误,但我看不出它应该发生的任何原因。继承我的代码:

#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]);

值得一提的是,如果我直接用函数中的代码替换函数调用,一切都运行良好。

1 个答案:

答案 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);