«Неявное создание неопределенного шаблона» при прямом объявлении класса шаблона

у меня есть некоторый код, в котором мне нужно заранее объявить класс шаблона (или, по крайней мере, объявление вперед сделало бы мне намного проще ...). Я'мы написали упрощенную версию проблемы, которую яу меня есть, чтобы я мог отобразить это здесь:

template
class MyTemplateClass;

int main( int argc, char* argv[] )
{
    MyTemplateClass myTemp;  // error here
    myTemp.GetTheValue();
    return 0;
}

template
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'

Какие еще детали мне нужно включить в предварительное объявление MyTemplateClass? Так как ошибка нене идет со следующей строки вниз, яЯ предполагаю, что это не такт из-за того, что метод не определен. Компилятор яЯ использую это LLVM / CLang, и ям компилируется на Mac.

Ответы на вопрос(3)

Насколько я понимаю, вы не можете заранее объявить что-то, а затем создать экземпляр в своем стеке (шаблон или нет).

Также я нене думаю, что тамочень широкая поддержка прямого определения класса шаблона

Ты забыл#include что-то?

Я получил это после того, как забыл

#include 

При использованииstd::array

: ^)

Решение Вопроса

Чтобы объявить переменную любого типа, шаблона или нет, должно быть доступно полное определение этого типа. Вы не можете заранее объявить шаблон, а затем начать использовать его, как если бы он был определен. Все, что вы можете сделать в этот момент, это объявить указатель на объект типа на основе шаблона, например так:

MyTemplateClass *myTempPtr;  // No error here

К сожалению (но не неожиданно) это переносит ошибку на следующую строку. Проблема инициализации этого указателя остается: как только вы попытаетесь вызватьnew MyTemplateClass, вы увидите ошибку.

Вам нужно перестроить код, чтобы переместить определение шаблона перед местом его использования. Это может быть несколько утомительно, но пути к этому нет: компилятору нужно иметь полное определение в точке, где вы начинаете создавать экземпляр шаблона и вызывать его методы.

Ваш ответ на вопрос