除非可能存在預先聲明沒有類模板的類child
,否則沒有可能出現該錯誤的原因。
一個原因可能是,你應該使用()
而不是{}
初始化成員:
child(std::vector<T> arg)
: _arg{arg}
{
}
應更正爲:
child(std::vector<T> arg)
: _arg(arg)
{
}
這也是更好地const引用傳遞:
child(const std::vector<T>& arg)
: _arg(arg)
{
}
但是,也有一些其他的事情,可以提高以輔助程序:
for循環不會編譯:
for(std::vector<T>::iterator it = _arg.begin(); it != _arg.end(); ++ it)
{
method2(voidp, *it);
}
T
是一個從屬名稱,這意味着std::vector<T>::iterator
應該更正爲typename std::vector<T>::iterator
。你可以閱讀更多關於這here。
但是,std::vector<T>::iterator
也應該更正爲std::vector<T>::const_iterator
。由於函數method
是const
,const
意味着函數將承諾不修改類的成員的任何任何。但是,vector中的iterator begin()
函數不是const限定的,這意味着編譯器不知道是否要修改成員。因此,必須使用過載const_iterator begin() const
,以便編譯器明確知道您不會修改任何成員。
另注:
for(const auto& x : _arg)
{
method2(voidp, x);
}
沒有必要在類中聲明public:
兩次:如果你正在使用c++11
,您可以通過使用範圍,用於循環使迴路短了很多;一旦public
已被聲明一次,下面的所有內容都將公開,直到編譯器達到另一個關鍵字protected
/private
,反之亦然。
請注意,class
的默認訪問級別爲private
,對於struct
爲public
。因此,你的類可以稍微修改本:
template<typename T>
class child : public base<T>
{
public:
child(const std::vector<T>& arg)
: _arg(arg)
{
}
virtual ~child() {}
void method(const void* voidp) const
{
for(typename std::vector<T>::const_iterator it = _arg.begin(); it != _arg.end(); ++ it)
{
method2(voidp, *it);
}
}
protected:
std::vector<T> _arg;
};
同樣爲您base
類:
template<typename T>
class base
{
protected:
base() {}
virtual ~base() {}
virtual void method(const void* voidp) const = 0;
};
要與你放置const
關鍵字在你的函數聲明是一致的:
您有:void* const voidp
然後const double& arg
。如圖所示,const
關鍵字不一致置於 - 一個後,一個類型之前:
這將是更好採取任一:const void* voidp, const double& arg
或void* const voidp, double const& arg
一致性。
要完成,我編譯使用MSVC下面的代碼,它工作得很好:
template<typename T>
class base
{
protected:
base() {}
virtual ~base() {}
virtual void method(const void* voidp) const = 0;
};
template<typename T>
class child : public base<T>
{
public:
child(const std::vector<T>& arg)
: _arg(arg)
{
}
virtual ~child() {}
void method(const void* voidp) const
{
for(typename std::vector<T>::const_iterator it = _arg.begin(); it != _arg.end(); ++it)
{
method2(voidp, *it);
}
}
protected:
std::vector<T> _arg;
};
希望這有助於:)
'的std ::矢量 :: iterator'應'類型名稱的std ::矢量 :: const_iterator'和'方法(voidp,*它);'調用內部是錯誤 - 沒有這樣的功能 –
@PiotrSkotnicki對不起,這是一個錯誤,讓我改變這一點。我的最小例子的問題是,我搞砸了,只給了你一半。 – user3728501
類'child'的構造函數有一個sintax錯誤:'_arg {arg}'應該是'_arg(arg)'。 – enzom83