48915


提示コードのコメント部なのですがエラーコード[エラー C2679 二項演算子 '<<': 型 'type' の右オペランドを扱う演算子が見つかりません
(または変換できません)。]  
とコンパイルエラーになるのですがなぜでしょうか？そろらくテンプレートのtypeに関係がると思われるのですが初学者のため修正方法がわかりません。教えてくれますでしょうか？

[code]

            #include <iostream>
    
                #pragma once
            #ifndef ___Header
            #define ___Header
    
    
    
            template<typename type,typename typeb>
            class base {
            private:
    
            protected:
    
            public:
                base(){ }
    
                virtual void f(int x) {
                    //type a = x;
                    std::cout << "仮想関数"<< x <<"\n";
                }
    
                virtual type f2(type x)const = 0;//純粋仮想関数
    
            };
    
            class type {
    
            };
            class typeb {
    
            };
    
            /*in main(){//int main()関数でこうする場合
            derive<int> d;
    
            _getch();
            return 0;
            }
            */
    
            template<typename typec> 
            class derive : public base<typename type, typename typeb> {
    
            public:
                derive(){ }
    
                    void f(int x) {
                    std::cout << "派生"<< x<<"\n";
                }
    
                type f2(type x)const {//この関数の中
                    //int a = x;
                    std::cout << x;
    
                    return x;
    
                }
    
            };
    
    
    
            #endif
    
[/code]


CC BY-SA 4.0
2018-10-03T00:00:21.443
48911
2018-10-03T02:14:43.590
question
c++
c++でテンプレートを使ってstd::cout<<x:で画面に表示できない。理由

[code]

            type f2(type x)const {//この関数の中
                //int a = x;
                std::cout << x;
    
                return x;
    
            }
    
[/code]

ここで、xの型は "type"とされています。  
"std::cout << x;"の部分で、class型のxをcoutに出力できるような値(String,int等)に変換しようとしますが、class
typeでは何も定義されていないので「xの値をPrintableなデータに変換する方法が判りません！」という悲鳴がコンパイラから出たという事です。

中身のないtypeクラスやtypebクラスは、どのような意図で作られ、どのような機能を持つべきなのかは
matsuzawaさんしか知りませんから、修正方針はわかりかねます。


CC BY-SA 4.0
2018-10-03T00:22:04.493
48912
2018-10-03T00:22:04.493
217
48911
answer


間違いだった場合はすみません。経過を見ていて想像したのですが、  
ひょっとすると、テンプレート仮引数に「型」を渡してクラス化する、  
という考えに至っていないように感じました。

例えば、class baseをテンプレートから、クラスにするには以下の様に「型」を渡します。  
using または typedefを使用すれば、作成したクラスに名前を付けることができます。

[code]

    using Base_for_Int = base< int, int>; // base<T1,T2>に対して T1をint T2にintを渡してクラス化
    
    //または
    //typedef  base< int, int> Base_for_Int;
    
[/code]

それを継承することもできます。

[code]

    class MyDeriv_form_BaseOfInt : public Base_for_Int{};
    
[/code]

もちろんテンプレートが継承することもできます。

[code]

    template< typename TX>
    class Deriv_of_Base_for_Int
       : public Base_for_Int
    {
    };
    
[/code]

同じことを別の書き方をすると

[code]

    template< typename TX>
    class Deriv_of_Base_for_Int
       : public base< int, int>// これがやりたいことかもしれません
    {
    };
    
[/code]


CC BY-SA 4.0
2018-10-03T01:22:44.940
48913
2018-10-03T01:22:44.940
3793
48911
answer


`class type { ... };` を `std::basic_ostream` に出力する手段がないからです。適切な `operator<<`
を実装してください。例

[code]

    template<typename charT, typename Traits>
    std::basic_ostream<charT, Traits>& operator<<(std::basic_ostream<charT, Traits>& os, type const& r) {
    // なんらかの出力
        return os;
    }
    
[/code]

説明のための説明に終始していて「やりたいこと」の実現には一歩も寄与していないので、このまま続けるのは無駄に１票。


CC BY-SA 4.0
2018-10-03T02:14:43.590
48915
2018-10-03T02:14:43.590
8589
48911
answer