2016-04-28 11 views
0

継承すると、サブクラスのインスタンスを返す関数で基本クラスを作成しようとしています。私は現在しようとしているものの要約版:派生型のインスタンスを返すCRTPと関数

A.h:

#include <string>  

template <typename Derived> 
class A { 

public: 
    A<Derived>(); 

    Derived Append(wchar_t the_char) const; 

protected: 
    std::wstring some_string; 

} // class A 

A.cpp:

#include "A.h" 

A<class Derived>::A() {} 

Derived A::Append(wchar_t the_char) const 
{ 
    Derived d(some_string); 
    d.some_string += the_char; 
    return d; 
} 

B.h:

class B : public A<B> 
{ 
public: 
    B(); 
}; 

B.cpp:私は整理の方法を見つけるのトラブルを抱えている、しかし

B theObj; 
theObj = theObj.Append(L'h'); 

B::B() : A() {} 

私はこれを行うことができるようにしたいことは、次のようなものですこれを達成するためのコード。私はここに何か必要な前方宣言の何らかの形があるかどうか分からない。いくつかのことを試してみたが、運がなかった。思考?

+0

おそらくあなたはこれを探しています:http://stackoverflow.com/a/11761568/1726343 –

+0

@AsadSaeeduddin私が戻したいのは、既存のオブジェクトへのポインタまたは参照ではなく、コピースタック上のそのオブジェクトの変更を適用します。また、私は既存のコードベースで作業していますので、ソリューション全体に行き渡らず、クラスの使用方法のセマンティクスを変更する必要もありません。私は、類似しているが同一ではないサブクラス間でコードを共有するために使用できる基本クラスを用意したいと思います。 私が掲示したコードの問題は、コードがコンパイルされた時点で「派生」が未定義とみなされることです。 – ShiggityShiggityShwa

+0

@ShiggityShiggityShwa http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file –

答えて

2

この構文をお探しですか?

template<class Derived> 
Derived A<Derived>::Append(wchar_t the_char) const 
{ 
    Derived d(some_string); 
    d.some_string += the_char; 
    return d; 
} 

これをcppファイルに置くとあまりうまくいかないでしょう。ヘッダーファイルに追加するか、インクルードすることができる他のファイル(.inlが.inlを呼び出すことがある)を作成して、ユーザーがアクセスできるようにすることをお勧めします。

関連する問題