2012-04-09 2 views
0

私は、C++プロジェクトをiOSに移植しようとしています。それは、LinuxとWindowsのQtCreatorとMSVCでもうまくコンパイルされます。 Xcode/GCC上で、特定のテンプレート化されたクラスで、私は次のエラーを受け取ります: "エラー:テンプレートパラメータリストがあまりにも少ない"。私は、typedefの構文についての何かが違法であり、GCCは標準のより厳密であることを推測しているGCCテンプレートエラー

template <typename TA, typename TB, int Type> 
class MyClassImpl 
{ 
public: 
    MyClassImpl(); 
    virtual int GetType() const 
    { 
     return type; 
    } 
};  

typedef MyClassImpl<float, int, 12> MyFloatIntClass; 

MyFloatIntClass::MyFloatIntClass() 
{ 
... 
} 

int MyFloatIntClass::GetType() const 
{ 
    return 22; 
} 

このエラーが発生したコードは次のようになります。 誰かが私に問題の正確さと解決方法を教えてもらえますか?

+0

これはあなたの実際のコードのコピー/ペーストである場合、あなたは 'を欠けている;' 'typedef'前にクラスの後。 – dasblinkenlight

+0

ではありません。 :) [編集] – iOSPorter

答えて

3

これは単なる推測ですが、テンプレート<>を追加する必要がありますか?

テンプレートの特殊化であるため、テンプレートである必要があります。

ex。

template<> 
MyFloatIntClass::MyClassImpl() {} 

template<> 
int MyFloatIntClass::GetType() const { 
    return 22; 
} 

EDIT:modelnineの回答から、ctorの名前がuntypedefである必要があります。

EDIT2:次のコードは、私のために正常に動作します:

template <typename TA, typename TB, int Type> 
class MyClassImpl 
{ 
public: 
    MyClassImpl(); 
    MyClassImpl(const MyClassImpl<TA, TB, Type>&); 
    virtual int GetType() const 
    { 
     return Type; 
    } 
    const MyClassImpl<TA, TB, Type>& operator=(const MyClassImpl<TA, TB, Type>&); 
};  

typedef MyClassImpl<float, int, 12> MyFloatIntClass; 

template<> 
MyFloatIntClass::MyClassImpl() 
{ 
// 
} 

template<> 
MyFloatIntClass::MyClassImpl(const MyFloatIntClass& rhs) 
{ 
// 
} 

template<> 
const MyFloatIntClass& MyFloatIntClass::operator=(const MyFloatIntClass& rhs) 
{ 
    return *this; 
} 

template<> 
int MyFloatIntClass::GetType() const 
{ 
    return 22; 
} 
+0

私はそれを試みましたが、それは間違いなくそれを悪化させます。私はテンプレート<>を追加すると、コンパイラはもう一つのテンプレートを定義したいと考えています。 – iOSPorter

+0

modelnineの回答を参照してください。これは私のものより優れています。 –

+0

@iOSPorter:これらのコピーはあなたのために機能しますか? rhsのタイプをMyClassImpl に完全に指定する必要があります。そうしないと、ダブルテンプレートが必要になります。 –

4

あなたは、各クラスのメソッドの完全な特殊化を定義しているとして、あなたはまだある、template <>で定義の前に付ける必要がありますあなたが欠けている "テンプレートパラメータリスト"。さらに、コンストラクタの名前はクラスであるため、MyFloatIntClass::MyFloatIntClass()は無効です(MyFloatIntClassはクラス名ではなくエイリアス)。以下は、(G ++ 4.5.3)私のために罰金をコンパイルします。

template <typename TA, typename TB, int Type> 
class MyClassImpl 
{ 
public: 
    MyClassImpl(); 
    virtual int GetType() const 
    { 
     return Type; 
    } 
};  

typedef MyClassImpl<float, int, 12> MyFloatIntClass; 

template <> 
MyFloatIntClass::MyClassImpl() 
{ 
} 

template <> 
int MyFloatIntClass::GetType() const 
{ 
    return 22; 
} 
+0

そのような作品、ありがとう!しかし、すべての場合にそうではありません。私もコピーコンストラクタと演算子=を持っているし、それらを処理する方法がわかりません。私はあなたに見せるためのサンプルソースコードを更新します。私と一緒にいてください。 – iOSPorter

+0

ありがとうございました。私はまだこのテンプレートクラスにいくつかの問題を抱えていますが、私は別の問題を開くだろうと思っています。どうもありがとうございました! – iOSPorter

関連する問題