std :: vector存储在模板类中

时间:2014-09-04 01:08:23

标签: c++ templates

我正在检查模板类是如何工作的,我遇到了以下错误:

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;

2 个答案:

答案 0 :(得分:4)

你有两个不同的问题。首先,烦恼的解析:

class B<int> store();

声明一个名为store的函数,它不带参数并返回B<int>,而不是默认构造的变量。只需编写B<int> store;或在C ++ 11中B<int> store{};class也是多余的,应该省略。

其次,

std::vector<B<T> > queue;

实例化具有不完整类型的标准库容器(类的类型在您达到其定义的结束}之前不完整),这是未定义的行为。根据实施情况,您可能可以逃脱它,但您真的不应该这样做。有一些非标准容器(例如those in Boost's containers library)可以保证支持不完整的类型 - 使用它们。

  

同样在模板类B中,它会在

之间产生影响
    std::vector<B<T> > queue;  
     

    std::vector<B> queue;

没有区别。在B的定义中,当上下文需要类型(而不是模板)时隐含<T>之后的B

答案 1 :(得分:1)

在你的代码中,“class 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);
}