我有一些代码需要在其中转发模板类(或者至少,前向声明会让我的事情变得容易得多......我已经编写了我遇到的问题的简化版本,因此我可以在此处显示它:
template<bool>
class MyTemplateClass;
int main( int argc, char* argv[] )
{
MyTemplateClass<false> myTemp; // error here
myTemp.GetTheValue();
return 0;
}
template<bool bShouldMult>
class MyTemplateClass
{
int m_myint;
float m_myfloat;
public:
MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {}
float GetTheValue()
{
return m_myint * (bShouldMult ? m_myfloat : 1.0f);
}
};
我在注释行遇到的错误是:
Error - implicit instantiation of undefined template 'MyTemplateClass<false>'
在 MyTemplateClass 的前向声明中,还需要包含哪些其他详细信息?由于错误不是来自下一行,因此我假设这不是由于该方法未定义的事实。我使用的编译器是LLVM/CLang,我在Mac上编译。
你忘了#include
什么吗?
我忘记了后得到了这个
#include <array>
使用std::array
时
:^)
为了声明任何类型的变量,无论是否模板,该类型的整个定义必须可用。不能向前声明模板,然后像定义模板一样开始使用它。此时您所能做的就是声明一个指向基于模板的类型对象的指针,如下所示:
MyTemplateClass<false> *myTempPtr; // No error here
不幸的是(但并非出乎意料)这会将错误移动到下一行。初始化该指针的问题仍然存在:一旦您尝试调用 new MyTemplateClass<false>
,您将看到一个错误。
您需要重新排列代码,以将模板的定义移到其使用位置之前。这可能有些乏味,但无法解决它:编译器需要在您开始实例化模板并调用其方法时拥有整个定义。
据我了解,您不能转发声明某些内容,然后在堆栈中实例化它(模板与否)。
另外,我认为对模板类的前向定义没有非常广泛的支持