質問内容
タイトルが少し分かりづらくなってしまいすいません。
私は普段テンプレートクラスを作る場合
下記のコード1のようにenable_ifを使い
入力できる型の制限をしていますが。
下記コード2のようにメソッドの定義と実装を分けて
書いてみました。
しかしコンパイルエラーが発生しました。(エラー内容は下記参照)
どうすればよいのかしばらく調べてみて
下記コード3のように書けば
コンパイルエラーもおかしな挙動もなく
動くことが分かりましたが
なぜコード2ではエラーが発生し
コード3では問題なく動くの分かりません。
どうか御回答よろしくお願い致します。
コード1
c++
1// 2// テンプレート引数に数値型以外入れることができない構造体Hoge 3// 4template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr> 5struct Hoge{ 6 Hoge()noexcept{ 7 std::cout << "Hogeのコンストラクタ" << std::endl; 8 } 9}; 10 11int main() { 12 Hoge<int> hoge1;//数値型なのでコンパイルエラーは発生しない 13 //Hoge<int*> hoge2;//ポインタ型なのでエラー発生 14 15 return 0; 16 17}
コード2
c++
1// 2// 構造体Hogeのメソッド(コンストラクタ)の定義と実装を分けるコード 3// 注意:本コードはコンパイルエラーが発生します。 4// 5 6#include <iostream> 7#include <type_traits> 8#include <memory> 9 10template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr> 11struct Hoge{ 12 Hoge()noexcept; 13}; 14 15template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr> 16Hoge<Type>::Hoge()noexcept{ 17 std::cout << "Hogeのコンストラクタ" << std::endl; 18} 19 20int main() { 21 Hoge<int> hoge1; 22 //Hoge<int*> hoge2; 23 24 return 0; 25 26}
コード3
c++
1// 2// コンパイルエラーもおかしな挙動もないコード 3// 4#include <iostream> 5#include <type_traits> 6#include <memory> 7 8template <typename Type, std::enable_if_t<std::is_arithmetic<Type>::value, std::nullptr_t> = nullptr> 9struct Hoge; 10 11template <typename Type> 12struct Hoge<Type>{ 13 Hoge()noexcept; 14}; 15 16template <typename Type> 17Hoge<Type>::Hoge()noexcept{ 18 std::cout << "Hogeのコンストラクタ" << std::endl; 19} 20 21int main() { 22 Hoge<int> hoge; 23 24 return 0; 25 26} 27
コード2をコンパイルしたときのエラー
terminal
1[コードのパス]/main.cpp:15:19: error: invalid use of incomplete type ‘struct Hoge<Type>’ 2 15 | Hoge<Type>::Hoge()noexcept{ 3 | ^~~~~~~~ 4[コードのパス]/main.cpp:10:8: note: declaration of ‘struct Hoge<Type>’ 5 10 | struct Hoge{ 6 | ^~~~
1つ目のエラーは不完全な型を使うなというエラー
2つ目は‘struct Hoge<Type>’の宣言がおかしいという注意喚起?
開発環境の備考
上記コードはすべてc++20でコンパイルするものとする。
ツールの種類 | ツールの名前 | バージョン |
---|---|---|
コンパイラ | clang++ | 10.0.0 |
OS | Linux Mint | 20.0 |
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/27 17:00
2020/07/27 18:27
退会済みユーザー
2020/07/28 09:18