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