2011-07-07 9 views
0

でテンプレートクラスとinit私はテンプレートクラス、Fooの持っている:そして、私は私のFooクラスの属性であり、これは、テンプレートパラメータとしてのFooクラスを取るのAttrと呼ばれる別のテンプレートクラスを持っているC++コンストラクタ

template <class A, class B> 
class Foo 
{ 
public: 
    Foo(A &aInstance); 

private: 
    Attr<Foo> _attr; 
}; 

を自体。

template <class C> 
class Attr 
{ 
    class SomeType 
    { 
     SomeType(); 
     ~SomeType(); 
    }; 

    Attr(const SomeType* st); 
    ~Attr(); 

private: 
    Attr(); 
} 

コンストラクタでinit _attr(Attr型)を使い、最初のパラメータをSomeTypeとしてテンプレートからキャストします。

Fooのコンストラクタの実装:

template<class A, class B> 
Foo<A, B>::Foo(A &aInstance): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) aInstance) 
{ 

} 

これはコンパイルされません。

エラー:エラーがfooでキャストラインを指し前に、プライマリ・表現予想 ')' トークン

をあたかもSomeTypeが認識されなかったかのように、コンストラクタを実装します。

私は今インスタンスを持っていますが、それでも同じエラーがあります。

+0

最後の編集は無意味なものになっているので、最後の編集をロールバックしました。お願い、それはやめて。他の編集については、これらの*も*既存の回答を妨害する。私はそれらをロールバックしていないが、将来的にしてください*追加の明確化を追加し、既存のコードを変更しないでください。 –

答えて

1

0)、その時点で

(Attr<Foo<A, B> >::SomeType *) A) 

Aは型名、タイプのすなわち名前、あなたがキャストできますので、何でもないです。

1)

また、Foo<A,B>したがって、Attr<Foo<A, B> >は、あまりにも依存名であり、ABに依存します。したがって、SomeTypeがタイプであるコンパイラ言うように、あなたがそこにtypenameが必要になります。

(typename Attr<Foo<A, B> >::SomeType *) somePointer) 

2)

をさらに、C++で、一般的にC++を好む - C-スタイルキャストの上にキャストします。あなたはそれらで多くの間違いをキャッチします。また一方this tutorial :)

3)

を参照してください:あなたがデザインすることにより、キャストを必要とするよろしいですか、すべきAttrポイントに正確にFoo<A, B>

2
template<class A, class B> 
Foo<A, B>::Foo(): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) A) 
{ 

} 

Aは型であり、コンストラクタに渡そうとしています。ここにインスタンスが必要です。

+1

私は 'typename'もここに必要だと信じています –

+0

あなたは正しいです!おかげでたくさん – Jack

1

まず、Attrクラスは(あなたのスニペットで)Cタイプを使用しないので、その使用場所とCとSomeTypeの関係は何かを説明する必要があります。

第二に、この行に

Foo<A, B>::Foo(): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) A) 

A型ではなくオブジェクトです。 _attrをFooオブジェクト自体で初期化する必要がある場合は、ポインタthisを渡す必要があります。

Foo<A, B>::Foo(): 
    _attr(
     (Attr<Foo<A, B> >::SomeType *) this) 

しかし、この点は、Fooのオブジェクトがまだ構築されていないことを、あなたがたAttrのコンストラクタ内のポインタで何をするか注意してください。

0

にあなたのコンストラクタを変更してみてください:あなたは、あなたがポインタをしたいので、インスタンスオブジェクトのアドレスを取得するために、アドレス演算子を追加する必要があります

template<class A, class B> 
Foo<A, B>::Foo(A &aInstance): 
    _attr(
     (typename Attr<Foo<A, B> >::SomeType *) &aInstance) {} 

...そうaInstance意志ポインタ型ではなく、オブジェクトへのポインタではなく、オブジェクト自身を(参照で)渡すのと実質的に同じ参照型になります。

0

これは私のために働く。いくつかのtypedefは、テンプレート化されたコードの意味を少し簡単にするのに役立ちます。

template<class C> 
class Attr 
{ 
public: 
    class SomeType 
    { 
     SomeType(); 
     ~SomeType(); 
    }; 

    typedef typename Attr<C>::SomeType ReachIntoSomeType; 

    Attr(const SomeType* st) { } 
    ~Attr() { } 

private: 
    Attr(); 
}; 

template <class A, class B> 
class Foo 
{ 
public: 
    Foo(A &aInstance) : _attr(reinterpret_cast<AttrOfFoo::ReachIntoSomeType*>(aInstance))  
    { } 

private: 
    typedef Attr<Foo> AttrOfFoo; 
    AttrOfFoo _attr; 
}; 
+0

良い神!コードは完全に台無しです! SOの最初の時間。誰か私のためにそれを修正することはできますか?ありがとう! – ForeverLearning