我的模板有点问题。由于使用代码更容易解释,这是我的问题。
我有一个接口类:
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结构,除了像这样的另一个模板classe的参数:
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);
};
并且它运行良好,但我有点失去了我的struct类的兴趣。
那么,我做错了什么?是否有“正确”的方式来做我想要的事情?
感谢。
答案 0 :(得分:2)
您必须添加typename
:
template <typename T>
class CTestMaybe
{
public:
CTestMaybe(typename vecValidators<T>::Type* a_Validators);
};
答案 1 :(得分:1)
类型vecValidators<T>::Type
是依赖名称(如果我获得了正确的术语)。这意味着你必须在那里增加typename
:
CTestMaybe(typename vecValidators<T>::Type* a_Validators);
答案 2 :(得分:1)
C ++在函数声明中编译了一个类型,但它看到vecValidators<T>::Type*
,而vecValidators
是template
,它不知道Type
是一个类型它,所以你必须使用typename
向编译器说出来,所以你应该将你的函数改为:
CTestMaybe(typename vecValidators<T>::Type* a_Validators);