我正在检查模板类是如何工作的,我遇到了以下错误:
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;
答案 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);
}