2017-04-08 19 views
1

これは私を夢中にしています。私はタイプをバイトに変換することを実験しています。私のアプローチを中心に機能を構築したので、テンプレートの控除エラーが発生していましたが、なぜそれが起こっているのかわかりません。 HERESに私のコード:なぜテンプレート引数の控除/置換が失敗しますか?

#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

名前空間stdを使用して '使用しないでください;' –

答えて

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); 
+0

本当にありがとうございました!私は、 'double * thing_back'を' from_bytes(&bytes_rx [0]) 'から返された値に設定するとテンプレートに通知するのに十分であると考えていました。どうしてそんなことができないの?私はそのアプローチが柔軟ではないかもしれないが、私は理由を確信していないことがわかります。 –

+0

@LordGonkでは、関数の戻り値が代入されるオブジェクトの型は、呼び出される関数を推論するために使用されることはありません。これは、関数テンプレートだけでなく、メンバ関数とメンバでない関数の通常の関数にも当てはまります。 –

関連する問題