簡體   English   中英

將自身存儲在模板類中的std :: vector

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM