Как работать с 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?