2011-02-10 19 views
0

にパラメータとしてテンプレートを使用して構造体を使用することができません:何 私は次のコードを持っている方法

...私は error: 'A' was not declared in this scopeに似ている do_somethng方法でコンパイルエラーを取得

template <typename A, typename B> 
struct TheStruct { 
    A a; 
    B b; 
}; 

class TheClass { 
public: 
    void do_something(TheStruct<A,B> blah); 
} 

をこの種の型をメソッドパラメータに定義する正しい構文ですか?

ありがとうございます!

+0

TheClassのAとBとは何ですか? – kennytm

+0

私は彼らがTheStructのAとBと同じであると仮定していましたか? –

答えて

2

あなたはどちらかに必要TheClassテンプレートを作ります:

template <typename A, typename B> 
class TheClass { 
public: 
    void do_something(TheStruct<A,B> blah); 
}; 

それともdo_something()テンプレートを作成する必要があります:

class TheClass { 
public: 
    template <typename A, typename B> 
    void do_something(TheStruct<A,B> blah); 
}; 
+0

該当しません。私の答えを参照してください – TonyK

+0

@ TonyK:本当ではないですか?営業担当者が一般的に「do_something」を希望していることはかなり明らかですか? –

+0

これは本当に私には似ています...確かに解決策ですが、一般的なAパラメータとBパラメータをTheClassのジェネリックであると伝えたいのかどうかは分かりませんが、かなり合理的です仮定。 –

0

は、AとBは、テンプレート定義にちょうどプレースホルダです。これを明確にする:あなたのテンプレート定義は、意味的に

template <typename TotallyDifferentA, typename TotallyDifferentB> 
struct TheStruct { 
    TotallyDifferentA a; 
    TotallyDifferentB b; 
}; 

と同じであるので、それは

void do_something(TheStruct<A,B> blah); 

がコンパイルされないことは驚くべきことではありませんAとBは定義されていません。これはコンパイルします:

class TheClass { 
public: 
    void do_something(TheStruct<int,void(*)(double,char*)> blah); 
} ; 
+0

清算してくれてありがとう...同じタイプ名(A&B)を持つような別のテンプレートを単純に定義すると、PigBenの答えが無効である理由を説明してください。最終的に、do-somethingに非テンプレート型(int、void(*)(double、char *))を渡す必要はありません。 –

+0

OK、今あなたが望むものを見ました:-) – TonyK

0

あなたはdo_somethingタイプAintBはあなたがどちらかALSO TheClassまたはdo_somethingテンプレートを作成する必要があります最初のケースではdouble

である(たとえばTheStruct、または1つの特定の1のいずれかのバージョンで動作するようにしたいですか(例は@PigBenから取得):

template <typename A, typename B> 
class TheClass { 
public: 
    void do_something(TheStruct<A,B> blah); 
}; 

OR

class TheClass { 
public: 
    template <typename A, typename B> 
    void do_something(TheStruct<A,B> blah); 
}; 

あなただけで作業する必要がある場合TheStructの具体的なインスタンスを作成する場合は、正確なタイプを指定してください:

class TheClass { 
public: 
    void do_something(TheStruct<int, double> blah); 
} 
関連する問題