前提・実現したいこと
異なる型同士を格納することができる配列を定義し,あるデータを入力すると,定義した順番通りに処理を実行するクラスを作成したいです.
(「PyTorch」の「nn.Sequential」「transforms」みたいなものを作りたいです.)
例えば,A〜Cの関数の中から好きなだけ選択し,データDに対して「関数A→関数B→関数A」を実行することを試みます.
この順番に処理を実行する配列Eを定義し,別のソースファイルSに引数として与えます.
Sは,データD,配列Eの情報をもとに,データDを「関数A→関数B→関数A」という流れに沿って実行します.
そこで,以下のコードを書きましたが,異なる型同士を格納する配列を別の関数に渡した途端動かなくなります.
クラスの継承元が同じであれば,ソースコードみたいに型が違っていても親クラスのポインタを利用することで同時に格納できると聞きました.
しかし,上記のエラーが発生して上手く動きませんでした.
どなたかこの原因を教えてくださると助かります.
また,解決策があれば教えていただけると幸いです.
<必須条件>
・「main.cpp」にて,「異なる型同士を格納する配列」と「処理の順番」を定義する.(下記のコードみたいに簡単に書けるようにしたい.)
・「active.cpp」にて,定義した順番通りに処理を実行する.
・「main.cpp」にて定義した「異なる型同士を格納する配列」は,関数の引数を利用して「active.cpp」に渡す.
・「differents.hpp」にて,定義した順番通りに処理を実行するプログラムを実装する.
・プログラミング言語:C++
発生している問題・エラーメッセージ
コンパイルしようとすると,「関数が見つからない」というエラーが発生します.
$ g++ main.cpp active.cpp In file included from main.cpp:2:0: differents.hpp: In function ‘int differents::forward(std::vector<differents::Compose*>&, int, int)’: differents.hpp:11:30: error: request for member ‘forward’ in ‘different’, which is of pointer type ‘differents::Compose*’ (maybe you meant to use ‘->’ ?) return different.forward(differents::forward(different_, data, count_next)); In file included from active.cpp:3:0: differents.hpp: In function ‘int differents::forward(std::vector<differents::Compose*>&, int, int)’: differents.hpp:11:30: error: request for member ‘forward’ in ‘different’, which is of pointer type ‘differents::Compose*’ (maybe you meant to use ‘->’ ?) return different.forward(differents::forward(different_, data, count_next));
該当のソースコード
・main.cpp
C++
1#include <vector> 2#include "differents.hpp" 3 4void active(std::vector<differents::Compose*> &different); // active.cppにて実装 5 6int main(void){ 7 std::vector<differents::Compose*> different{ 8 (differents::Compose*)new differents::process1(2), 9 (differents::Compose*)new differents::process2(3), 10 (differents::Compose*)new differents::process1(4) 11 }; 12 active(different); 13 return 0; 14}
・active.cpp
C++
1#include <iostream> 2#include <vector> 3#include "differents.hpp" 4 5void active(std::vector<differents::Compose*> &different){ 6 int ans = differents::forward(/*different_=*/different, /*data=*/5, /*count=*/different.size()); 7 std::cout << ans << std::endl; // (4 + (3 + (2 + 5 + 1) + 2) + 1) = 18 8}
・differents.hpp
C++
1#include <vector> 2 3namespace differents{ 4 5 class Compose{}; 6 7 int forward(std::vector<differents::Compose*> &different_, const int data, const int count){ 8 int count_next = count - 1; 9 auto different = different_.at(count_next); 10 if (count_next >= 0){ 11 return different.forward(differents::forward(different_, data, count_next)); 12 } 13 return data; 14 } 15 16 class process1 : differents::Compose{ 17 private: 18 int x; 19 public: 20 process1(const int x_){ 21 x = x_; 22 } 23 int forward(const int y){ 24 return x + y + 1; 25 } 26 }; 27 28 class process2 : differents::Compose{ 29 private: 30 int x; 31 public: 32 process2(const int x_){ 33 x = x_; 34 } 35 int forward(const int y){ 36 return x + y + 2; 37 } 38 }; 39 40 class process3 : differents::Compose{ 41 private: 42 int x; 43 public: 44 process3(const int x_){ 45 x = x_; 46 } 47 int forward(const int y){ 48 return x + y + 5; 49 } 50 }; 51 52} 53
試したこと
以下のように実行したらエラーが出ました.
$ g++ main.cpp active.cpp In file included from main.cpp:2:0: differents.hpp: In function ‘int differents::forward(std::vector<differents::Compose*>&, int, int)’: differents.hpp:11:30: error: request for member ‘forward’ in ‘different’, which is of pointer type ‘differents::Compose*’ (maybe you meant to use ‘->’ ?) return different.forward(differents::forward(different_, data, count_next)); In file included from active.cpp:3:0: differents.hpp: In function ‘int differents::forward(std::vector<differents::Compose*>&, int, int)’: differents.hpp:11:30: error: request for member ‘forward’ in ‘different’, which is of pointer type ‘differents::Compose*’ (maybe you meant to use ‘->’ ?) return different.forward(differents::forward(different_, data, count_next));
「*」を「->」に変更してもエラーが出ました.
$ g++ main.cpp active.cpp In file included from main.cpp:2:0: differents.hpp: In function ‘int differents::forward(std::vector<differents::Compose*>&, int, int)’: differents.hpp:11:31: error: ‘class differents::Compose’ has no member named ‘forward’ return different->forward(differents::forward(different_, data, count_next)); ^~~~~~~ In file included from active.cpp:3:0: differents.hpp: In function ‘int differents::forward(std::vector<differents::Compose*>&, int, int)’: differents.hpp:11:31: error: ‘class differents::Compose’ has no member named ‘forward’ return different->forward(differents::forward(different_, data, count_next));
補足情報(FW/ツールのバージョンなど)
C++14
回答2件
あなたの回答
tips
プレビュー