[英]An std::vector storing itself in a template class
我正在檢查模板類的工作方式,並且出現以下錯誤:
template <class T>
class B
{
public:
std::vector<B<T> > queue;
B();
~B();
};
int main()
{
class B<int> tempQ();
class B<int> temp2Q();
class B<int> store();
store.queue.push_back(tempQ);
store.queue.push_back(temp2Q);
}
它給了我一個編譯錯誤:
main.cpp:52:8: error: request for member 'queue' in 'store', which is of non-class type 'B<int>()'
main.cpp:52:8: error: request for member 'queue' in 'store', which is of non-class type 'B<int>()'
有人可以給我一些線索嗎?
同樣在模板類B內,它將在
std::vector<B<T> > queue;
和
std::vector<B> queue;
您有兩個不同的問題。 首先,煩人的解析:
class B<int> store();
聲明一個名為store
的函數,該函數不帶任何參數並返回B<int>
,而不是默認構造的變量。 只需寫B<int> store;
或者,在C ++ 11中, B<int> store{};
。 class
也是多余的,應省略。
第二,
std::vector<B<T> > queue;
用一個不完整的類型實例化一個標准庫容器(類的類型直到您按下其定義的結束}
才完成),這是未定義的行為。 根據實現的不同,您也許可以擺脫它,但實際上不應該這樣做。 有保證可以支持不完整類型的非標准容器(例如Boost的容器庫中的容器 ),請使用這些容器 。
同樣在模板類B內,它將在
std::vector<B<T> > queue;
和
std::vector<B> queue;
沒有不同。 在B
的定義內,當上下文需要類型(而不是模板)時,在B
后面隱含<T>
。
在您的代碼中,“ B類tempQ();” 並不意味着聲明變量,而只是聲明函數。
這是解決方案..
template <class T>
class B
{
public:
std::vector<B<T>> queue;
B() {};
~B() {};
};
int main()
{
B<int> tempQ;
B<int> temp2Q;
B<int> store;
store.queue.push_back(tempQ);
store.queue.push_back(temp2Q);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.