"Неявный экземпляр неопределенного шаблона" при прямом объявлении класса шаблона
у меня есть код, в котором мне нужно переадресовать-объявить класс шаблона A (или, по крайней мере, переадресация сделает вещи намного проще для меня...). Я написал упрощенную версию проблемы, которую у меня есть, поэтому я могу отобразить ее здесь:
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.
3 ответов
для объявления переменной любого типа, шаблона или нет, должно быть доступно все определение этого типа. Нельзя вперед-объявить шаблон, а затем начать использовать его, как если бы он был определен. Все, что вы можете сделать в этот момент, это объявить указатель на объект типа на основе шаблона, например:
MyTemplateClass<false> *myTempPtr; // No error here
к сожалению (но не неожиданно) это ошибка в следующей строке. Проблема инициализации этого указателя остается: как только вы попытаетесь invoke new MyTemplateClass<false>
, вы увидите ошибку.
вам нужно переупорядочить код, чтобы переместить определение шаблона перед его местом использования. Это может быть несколько утомительно, но нет никакого способа обойти это: компилятор должен иметь все определение в точке, где вы начинаете создавать экземпляр своего шаблона и вызывать его методы.
ты забыл #include
что-то?
я получил это после того, как забыл
#include <array>
при использовании std::array
:^)
Это из моего понимания, что вы не можете переслать объявить что-то, а затем создать его в своем стеке (шаблон или нет).
также я не думаю, что существует очень широкая поддержка прямого определения класса шаблонов