質問概要
クラステンプレート内に定義したクラステンプレートのポインタを返り値にもつメンバ関数を、クラス定義とは別ファイルに実装する場合の書き方がわかりません(T_T)
質問詳細
test.hpp
に以下のようにクラスを定義するとします。
C++
1#include <type_traits> 2#include <iostream> 3template <class T> 4class OuterClass 5{ 6 private: 7 T test; 8 public: 9 template<class U> 10 class InnerClass 11 { 12 private: 13 U test2; 14 public: 15 InnerClass(/* args */){}; 16 ~InnerClass(){}; 17 }; 18 19 public: 20 InnerClass<int>* test(); ←こいつの実装をtest.ipp に書く 21 22 OuterClass(/* args */){}; 23 ~OuterClass(){}; 24 25}; 26 27#include "test.ipp"
test.ipp
に InnerClass<int>* test();
を実装します
C++
1template <class T> 2typename OuterClass<T>::InnerClass<int>* OuterClass<T>::test() 3{ 4 std::cout << "test" << std::endl; 5 return (NULL); 6}
そしてこれを、test.cpp
で以下のように呼ぶと、エラーが吐かれてしまいます
C++
1#include "test.hpp" 2 3int main() 4{ 5 OuterClass<int> a; 6 a.test(); 7}
c1r1s9% clang++ test.cpp In file included from test.cpp:1: ./test.hpp:20:20: error: redefinition of 'test' as different kind of symbol InnerClass<int>* test(); ^ ./test.hpp:7:5: note: previous definition is here T test; ^ In file included from test.cpp:1: In file included from ./test.hpp:27: ./test.ipp:3:25: error: use 'template' keyword to treat 'InnerClass' as a dependent template name typename OuterClass<T>::InnerClass<int>* OuterClass<T>::test() ^ template ./test.ipp:3:57: error: redefinition of 'test' as different kind of symbol typename OuterClass<T>::InnerClass<int>* OuterClass<T>::test() ^ ./test.hpp:7:5: note: previous definition is here T test; ^ 3 errors generated. c1r1s9%
おそらく、test.ipp の書き方が違うと思うのですが、どうやって書けばコンパイルできるのでしょうか??
##実験してみたこと
上記のエラーメッセージのうち
./test.ipp:3:25: error: use 'template' keyword to treat 'InnerClass' as a dependent template name typename OuterClass<T>::InnerClass<int>* OuterClass<T>::test() ^ template
に注目し、以下のようにtest.ipp
を書き換えてみました。
C++
1 2template <class T> 3typename OuterClass<T>::template InnerClass<int>* OuterClass<T>::test() //template というワードを追加 4{ 5 std::cout << "test" << std::endl; 6 return (NULL); 7}
すると、エラーメッセージは以下のように減りましたが、ここから先に進めません。お力をお貸しください
c1r1s9% clang++ test.cpp In file included from test.cpp:1: ./test.hpp:20:20: error: redefinition of 'test' as different kind of symbol InnerClass<int>* test(); ^ ./test.hpp:7:5: note: previous definition is here T test; ^ In file included from test.cpp:1: In file included from ./test.hpp:27: ./test.ipp:3:66: error: redefinition of 'test' as different kind of symbol typename OuterClass<T>::template InnerClass<int>* OuterClass<T>::test() ^ ./test.hpp:7:5: note: previous definition is here T test; ^ 2 errors generated. c1r1s9%
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。