1

テンプレートに少し問題があります。コードで説明する方が簡単なので、ここに私の問題があります。

私はインターフェースクラスを持っています:

template <typename T>
class IElemValidator
{
public:
    virtual bool validate(T val) const = 0 ;
    virtual ~IElemValidator(){};
};

およびtypedef構造体:

template <typename T>
struct vecValidators
{
    typedef boost::ptr_vector<IElemValidator<T>> Type;
};

次のような別のテンプレートクラスのパラメータを除いて、どこでもtypedef構造体を使用できます。

template <typename T>
class CTestMaybe
{
public:
    CTestMaybe(vecValidators<T>::Type* a_Validators);
};

コンパイルしようとすると、次のエラーが発生します。

Error   2   error C2061: syntax error : identifier 'Type'

もちろん、私はこれを行うことができます:

template <typename T>
class CTestMaybe
{
private:
    typedef boost::ptr_vector<IElemValidator<T>> vecValidator;

public:
    CTestMaybe(vecValidator* a_Validators);


};

うまく機能していますが、構造体クラスの興味を失っています。

だから、私が間違っているのは何ですか?私がやりたいことをするための「正しい」方法はありますか?

ありがとう。

4

3 に答える 3

2

追加する必要がありますtypename

template <typename T>
class CTestMaybe
{
public:
    CTestMaybe(typename vecValidators<T>::Type* a_Validators);
};
于 2012-10-19T07:58:42.860 に答える
1

タイプvecValidators<T>::Type従属名です(用語が正しい場合)。typenameこれは、そこに余分なものを配置する必要があることを意味します。

CTestMaybe(typename vecValidators<T>::Type* a_Validators);
于 2012-10-19T08:01:44.887 に答える
1

C ++コンパイラは関数宣言の型ですが、代わりにそれが内部の型であることがわかりません。そのため、を使用してコンパイラに指定するvecValidators<T>::Type*必要vecValidatorstemplateあるため、関数を次のように変更する必要があります。Typetypename

CTestMaybe(typename vecValidators<T>::Type* a_Validators);
于 2012-10-19T08:01:56.947 に答える