【发布时间】:2020-11-17 10:10:03
【问题描述】:
我在一个大型代码库的头文件中看到了这一点。当我尝试在源文件中执行此操作时,编译器抱怨。编译器在头文件中没问题的事实仍然很有趣,所以我想知道它是如何以及为什么工作的。这是一个非常复杂的类,所以我无法破译它。
所以这是一个简单的类:
template <typename T>
class Container {
public:
Container(T value) : _value(value){};
T get() { return _value; }
void set(T value) { _value = value; }
private:
T _value;
};
现在在其他一些头文件中,我有这个其他类:
class ContainerFactory
{
private:
Containter<int> *_container1{nullptr}; //this will work as expected
Container *_container2{nullptr}; //this won't work, the compiler will ask for a type
std::map<Container*, UIControl*> _map; //this won't work either, but it is handy
//if I have several types of Container.
}
为了向编译器声明_container2,我必须做些什么所谓的“技巧”。我尝试了前向声明,但它显然不起作用。我应该创建另一个派生自Container 的类并做一些额外的事情吗?请指教。谢谢!
【问题讨论】:
-
类模板不是类型;它们是创建类型的蓝图。您无法形成指向
Container的指针,因为Container不是一种类型,并且永远不可能有Container对象指向它。 -
头文件中的版本可能是:从不包含;在另一个从未实例化的模板中;或者不像你想象的那样与源代码中的版本完全相同
-
@MilesBudnek,我明白你在说什么,但我亲眼看到了代码。它只是一个实现了太多接口的类,比如其中的 5 个,据我所知,它本身就是一个模板类。我想要的是一些完成此任务的骨架代码。
-
@armanali: "我明白你在说什么,但我已经亲眼看到了代码。" 然后通过展示你看到的代码来证明这一点自己的眼睛。您在此处发布的代码无法编译,并且您描述的代码无法编译除非它位于
Container模板本身中。 -
@NicolBolas,如果它是我的代码,我会拥有的:)
标签: c++ templates visual-c++ c++14 c++17