環境
- Visual Studio 2017
- C++11
内容
下記のような親子関係があるテンプレートクラスを Curiously Recurring Template Pattern で作りました。
cpp
1#include <iostream> 2 3// 親クラス 4template <class Child> 5struct Base 6{ 7 void interface() 8 { 9 static_cast<Child *>(this)->implementation(); 10 } 11}; 12 13// 子クラス1 14struct Derived1 : Base<Derived1> 15{ 16 void implementation() 17 { 18 std::cout << "Derived1" << std::endl; 19 } 20}; 21 22// 子クラス2 23struct Derived2 : Base<Derived2> 24{ 25 void implementation() 26 { 27 std::cout << "Derived2" << std::endl; 28 } 29}; 30 31int main(int argc, char *argv[]) 32{ 33 Derived1().interface(); 34 Derived2().interface(); 35}
output
1Derived1 2Derived2
その後、親クラスに1つテンプレート引数を追加したくなりました。
そのため、子クラスにもテンプレート引数を追加して、親クラスにそのまま渡すようにしたところ、下記のようなコンパイルエラーが出ました。
cpp
1// 親クラス 2template <class Child, class SomeType> 3struct Base 4{ 5 void interface() 6 { 7 static_cast<Child *>(this)->implementation(); 8 } 9 10 protected: 11 SomeType hoge; 12}; 13 14// 子クラス1 15template <class SomeType> 16struct Derived1 : Base<Derived1, SomeType> // コンパイルエラーその1 17{ 18 void implementation() 19 { 20 std::cout << "Derived1" << std::endl; 21 } 22}; 23 24// 子クラス2 25template <class SomeType> 26struct Derived2 : Base<Derived2, SomeType> // コンパイルエラーその2 27{ 28 void implementation() 29 { 30 std::cout << "Derived2" << std::endl; 31 } 32}; 33 34int main(int argc, char *argv[]) 35{ 36 Derived1<int>().interface(); 37 Derived2<int>().interface(); 38}
エラー: C3203: 'Derived1': 非特殊 クラス テンプレート は、テンプレート 引数として テンプレート パラメーター 'Child' に使用できません。実際の型を指定してください コンパイル対象の クラス テンプレート インスタンス化 'Derived1<SomeType>' のリファレンスを確認してください エラー: C3203: 'Derived2': 非特殊 クラス テンプレート は、テンプレート 引数として テンプレート パラメーター 'Child' に使用できません。実際の型を指定してください コンパイル対象の クラス テンプレート インスタンス化 'Derived2<SomeType>' のリファレンスを確認してください
エラーIDで検索しても コンパイラ エラー C3203 | Microsoft Docs ぐらいしか情報がなく、参照してもなにが問題なのかわからないのですが、どなたかご教示いただけないでしょうか。
聞きたいこと
- コンパイルエラーとなる理由
- このような事はそもそも実現可能かどうか (代替案でもよいです)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/12 09:20
2019/03/12 09:34
2019/03/12 09:36
2019/03/12 09:45