2012-04-02 13 views
1

私はここで何をしようとしているかについて、C++に既知のパターン/イディオムがあるかどうかを調べようとしています。クラスAは、引数がタイプAでなければならない関数を持つオブジェクトで構成されていなければなりません。次のコードは、定数式でtypeidを使用できないためコンパイルされません。助言がありますか?引数を取り囲むクラスを持つメソッドでC++オブジェクトを持つには?

#include <iostream> 
#include <typeinfo> 
using namespace std; 

template <typename T> 
struct B { 
    int f(T& i) { cout << "Hello\n"; } 
}; 

class A { 
    B<typeid(A)> b; 
}; 

int main() 
{ 
    A k; 
} 

答えて

0

B<A> b;次のプログラムは、g ++ 4.4.3でエラーまたは警告なしでコンパイルされます。

#include <iostream> 
#include <typeinfo> 
using namespace std; 

template <typename T> 
struct B { 
    int f(T& i) { cout << "Hello\n"; return 0; } 
}; 

class A { 
public: 
    B<A> b; 
}; 

int main() 
{ 
    A k; 
    return k.b.f(k); 
} 

:あなたが唯一の前方宣言を避けるために、テンプレートを使用している場合は、私の解決策が間違っています。しかし、他の正当な理由のためにテンプレートを使用している場合に備えて、ここに残しておきます。

1

あなたの規定の要件がすべてでテンプレートを必要としない、単なる前方宣言:

#include <iostream> 

class A; // forward declare A 

struct B { 
    int f(A &i); // declaration only, definition needs the complete type of A 
}; 

class A { 
    B b; 
}; 

int B::f(A &i) { std::cout << "Hello\n"; } // define f() 

int main() 
{ 
    A k; 
} 
+0

+1 D'oh。 OPは、少なくとも彼の述べられた理由のために、全くテンプレートを必要としません。 –

関連する問題