"Неявное создание неопределенного шаблона" при переадресации объявления класса шаблона

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

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.

Ответ 1

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

MyTemplateClass<false> *myTempPtr;  // No error here

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

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

Ответ 2

Вы забыли, что-то #include?

Я получил это, забыв

#include <array>

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

: ^)

Ответ 3

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

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