Как работать с template?

Есть код ниже. Компилятор говорит синтаксическая ошибка (тоже ниже). Но мне не совсем понятно, что именно не так. Создал шаблонный класс ParagraphTests, внутри него в методе FailsOnInvalidParameters пользуюсь статическим шаблон-методом Create из класса Paragraph.

Файл ParagraphTests.h:

#pragma once
#include <cassert>
#include "ConfigableTests.h"

template <typename T>
class ParagraphTests : public ConfigableTests
{
public:
    ParagraphTests(OutputConfig config);

    void FailsOnInvalidParameters(const wchar_t* const text);
};


template<typename T>
inline ParagraphTests<T>::ParagraphTests(OutputConfig config) : ConfigableTests(config)
{
}

template<typename T>
inline void ParagraphTests<T>::FailsOnInvalidParameters(const wchar_t* const text)
{
    try
    {
        /*** ВОТ ЗДЕСЬ ОШИБКА ***/
        T* paragraph = Paragraph::Create<T>(text, Config);
        delete paragraph;
    }
    catch (int e)
    {
        return;
    }
    
    assert(false && "FailsOnInvalidParameters");
}

Файл Paragraph.h (удалил ненужные для этого вопроса поля и методы):

#pragma once
#include <cstdio>
#include "OutputConfig.h"

class Paragraph
{
public:
    virtual ~Paragraph() = default;
    
public:
    /*** ВОТ ОН ***/
    template <typename T>
    static T* Create(const wchar_t* const text, OutputConfig config);

    void Init(const wchar_t* const text, OutputConfig config);
};

/*** ВОТ ОН ***/
template<typename T>
inline T* Paragraph::Create(const wchar_t* const text, OutputConfig config)
{
    T* paragraph = new T();
    paragraph->Init(text, config);
    return paragraph;
}

Возникающая ошибка:

1>CodeTests.cpp
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(26,29): error C7510: "Create": при использовании зависимого имени шаблон необходимо указать префикс "шаблон"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,2): error C3878: синтаксическая ошибка: непредвиденный маркер "catch" после "try_block"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,2): message : пропущено восстановление ошибки: "catch"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): error C2760: синтаксическая ошибка: непредвиденный элемент "идентификатор". Ожидается "выражение"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): error C3878: синтаксическая ошибка: непредвиденный маркер "идентификатор" после "expression"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): message : пропущено восстановление ошибки: "идентификатор"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): error C2760: синтаксическая ошибка: непредвиденный элемент ")". Ожидается ";"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): error C3878: синтаксическая ошибка: непредвиденный маркер ")" после "expression_statement"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): message : пропущено восстановление ошибки: ")"
1>Header.cpp
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\Header.cpp(90,45): warning C4267: аргумент: преобразование из "size_t" в "const int"; возможна потеря данных
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\Header.cpp(115,54): warning C4267: аргумент: преобразование из "size_t" в "const int"; возможна потеря данных
1>HeaderTests.cpp
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(26,29): error C7510: "Create": при использовании зависимого имени шаблон необходимо указать префикс "шаблон"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,2): error C3878: синтаксическая ошибка: непредвиденный маркер "catch" после "try_block"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,2): message : пропущено восстановление ошибки: "catch"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): error C2760: синтаксическая ошибка: непредвиденный элемент "идентификатор". Ожидается "выражение"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): error C3878: синтаксическая ошибка: непредвиденный маркер "идентификатор" после "expression"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): message : пропущено восстановление ошибки: "идентификатор"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): error C2760: синтаксическая ошибка: непредвиденный элемент ")". Ожидается ";"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): error C3878: синтаксическая ошибка: непредвиденный маркер ")" после "expression_statement"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): message : пропущено восстановление ошибки: ")"
1>Paragraph.cpp
1>ParagraphTests.cpp
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(26,29): error C7510: "Create": при использовании зависимого имени шаблон необходимо указать префикс "шаблон"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,2): error C3878: синтаксическая ошибка: непредвиденный маркер "catch" после "try_block"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,2): message : пропущено восстановление ошибки: "catch"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): error C2760: синтаксическая ошибка: непредвиденный элемент "идентификатор". Ожидается "выражение"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): error C3878: синтаксическая ошибка: непредвиденный маркер "идентификатор" после "expression"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,13): message : пропущено восстановление ошибки: "идентификатор"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): error C2760: синтаксическая ошибка: непредвиденный элемент ")". Ожидается ";"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): error C3878: синтаксическая ошибка: непредвиденный маркер ")" после "expression_statement"
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(29,14): message : пропущено восстановление ошибки: ")"

Здесь, как я понял, всё-таки основными являются эти ошибки:

1>CodeTests.cpp
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(26,29): error C7510: "Create": при использовании зависимого имени шаблон необходимо указать префикс "шаблон"

1>HeaderTests.cpp
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(26,29): error C7510: "Create": при использовании зависимого имени шаблон необходимо указать префикс "шаблон"

1>ParagraphTests.cpp
1>D:\Progs\C++\SalnikovMSU\Project1\Project1_VS\Project1_VS\ParagraphTests.h(26,29): error C7510: "Create": при использовании зависимого имени шаблон необходимо указать префикс "шаблон"

Ответы (1 шт):

Автор решения: HolyBlackCat

префикс "шаблон"

Шикарный перевод; имеется в виду префикс template. Советую переключить ошибки на английский.

T* paragraph = Paragraph::template Create<T>(text, Config);

Подробности тут: Where and why do I have to put the "template" and "typename" keywords?

→ Ссылка