###実現したいこと
完全特殊化のところ(53行目)で元の関数と同じように配列を用いた処理をしたい
発生している問題・エラーメッセージ
エラーメッセージ Error: Expression must have pointer-to-object type in "Serial_Writer.h", Line: 53, Col: 25
オーバーロード元では配列を用いた処理(send[0]など)ができるのに完全特殊化したところで同様の処理を行うと上記のエラーが出ます 。
該当のソースコード
c++
1#ifndef SERIAL_WRITER 2#define SERIAL_WRITER 3#include <mbed.h> 4 5class Serial_Writer 6{ 7public: 8 Serial_Writer(PinName TxPin,PinName RxPin,int baudrate); 9 template <typename T> 10 inline void write(T &send,int delay){ 11 int num=sizeof(send); 12 char buffer[num+2]; 13 for (int i=1,k=0;i<=num;k++){ 14 for(int _bitNum=sizeof(send[0])-1;_bitNum>=0;i++,_bitNum--)buffer[i]=(send[k]>>(8*_bitNum))&0xFF; 15 } 16 buffer[0]='['; 17 buffer[num+1]=']'; 18 for (int p=0;p<sizeof(buffer);p++)_Serial.putc(buffer[p]); 19 wait_ms(delay); 20 } 21 22 template <typename R> 23 inline int receive(R &get){ 24 int num=sizeof(get); 25 int num_0=sizeof(get[0]); 26 char buffer[num+2]; 27 if (_Serial.readable()){ 28 for(int i=0;i<sizeof(buffer);i++){ 29 buffer[i]=_Serial.getc(); 30 if(buffer[0]!='[')return -1; 31 } 32 if(buffer[num+1]==']'){ 33 for (int s=0;s<(num/num_0);s++)get[s]=0x0; 34 for (int p=1,k=0;p<=num;k++){ 35 for (int _byte=num_0-1;_byte>=0;p++,_byte--)get[k]|=buffer[p]<<(8*_byte); 36 } 37 return 0;//正常終了 38 }else return -1;//異常終了1(正しく受信していない) 39 }else return -2;//異常終了2(受信しない) 40 } 41 42private: 43 Serial _Serial; 44}; 45 46template<> 47inline void Serial_Writer::write<double>(double &send,int delay){ 48 int num=sizeof(send); 49 char buffer[num+2]; 50 int send_c[num]; 51 for(int _n=0;_n<num;_n++){ 52 send_c[_n]=int(send[_n]*100);//エラー箇所 53 } 54} 55 56template<> 57inline void Serial_Writer::write<float>(float &send,int delay){ 58 int num=sizeof(send); 59 char buffer[num+2]; 60 int send_c[num]; 61 for(int _n=0;_n<num;_n++)send_c[_n]=int(send[_n]*100); 62} 63 64 65#endif
試したこと
オーバーロードの元の関数では(10行目)では参照渡しで配列を渡し、関数内でsend[0]などを用いてもエラーが出ないことは確認済みです
53行目のところで元の関数と同様の処理を行ってエラーが出る理由がわかりません
補足情報
これはmbedにてシリアル通信のコードを簡潔化するために作ったライブラリです(完全特殊化のところは未完成)
templateを.hファイルでなくて.cppファイルに記述する方法がもしわかる方は教えてください。
ちなみに.cppファイルはこんな感じです
c++
1#include <Serial_Writer.h> 2 3Serial_Writer::Serial_Writer(PinName TxPin,PinName RxPin,int baudrate):_Serial(TxPin,RxPin,baudrate){}
新しいエラー
saitou様のコードを参考に書き換えてみたところ、コンパイルできる寸前で新たなエラーが出てしまったのでお願いします。
c++
1#ifndef SERIAL_WRITER 2#define SERIAL_WRITER 3#include <mbed.h> 4#include <iostream> 5 6class Serial_Writer 7{ 8private: 9 template <typename T,std::size_t N> 10 struct writer{ 11 void write(T (&send)[N],int delay){ 12 int num=sizeof(send); 13 char buffer[num+2]; 14 for (int i=1,k=0;i<=num;k++){ 15 for(int _bitNum=sizeof(send[0])-1;_bitNum>=0;i++,_bitNum--)buffer[i]=(send[k]>>(8*_bitNum))&0xFF; 16 } 17 buffer[0]='['; 18 buffer[num+1]=']'; 19 for (int p=0;p<sizeof(buffer);p++)_Serial.putc(buffer[p]);//エラー発生(Error: A nonstatic member reference must be relative to a specific object in "Serial_Writer.h", Line: 19, Col: 48) 20 wait_ms(delay); 21 } 22 }; 23 24 template<std::size_t N> 25 struct writer<double,N>{ 26 void write(double (&send)[N],int delay){ 27 int num=sizeof(send); 28 char buffer[num+2]; 29 int send_c[num]; 30 for(int _n=0;_n<num;_n++)send_c[_n]=int(send[_n]*100); 31 } 32 }; 33 34 template<std::size_t N> 35 struct writer<float,N>{ 36 void write(float (&send)[N],int delay){ 37 int num=sizeof(send); 38 char buffer[num+2]; 39 int send_c[num]; 40 for(int _n=0;_n<num;_n++)send_c[_n]=int(send[_n]*100); 41 } 42 }; 43 44 template <typename R> 45 inline int receive(R &get){ 46 int num=sizeof(get); 47 int num_0=sizeof(get[0]); 48 char buffer[num+2]; 49 if (_Serial.readable()){ 50 for(int i=0;i<sizeof(buffer);i++){ 51 buffer[i]=_Serial.getc(); 52 if(buffer[0]!='[')return -1; 53 } 54 if(buffer[num+1]==']'){ 55 for (int s=0;s<(num/num_0);s++)get[s]=0x0; 56 for (int p=1,k=0;p<=num;k++){ 57 for (int _byte=num_0-1;_byte>=0;p++,_byte--)get[k]|=buffer[p]<<(8*_byte); 58 } 59 return 0;//正常終了 60 }else return -1;//異常終了1(正しく受信していない) 61 }else return -2;//異常終了2(受信しない) 62 } 63 64public: 65 Serial_Writer(PinName TxPin,PinName RxPin,int baudrate); 66 template<typename T,std::size_t N>void write(T (&send)[N],int delay){ 67 struct writer<T,N> k; 68 k.write(send,delay);//ここでも同様のエラーがでましたがインスタンスを生成すると治りました 69 } 70 Serial _Serial; 71}; 72 73 74#endif
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/13 11:43
2021/05/13 11:55
2021/05/13 13:53
2021/05/13 15:40
2021/05/13 17:12
2021/05/13 22:52