Я занимаюсь некоторыми упражнениями, чтобы понять шаблон C++. Мое намерение состоит в том, чтобы создать шаблон функции, который изменяет поведение в базе класса шаблона.
Я получаю следующее сообщение об ошибке:
In file included from main.cpp:2:0:
test1.h: In function ‘int my::fun(char*, int):
test1.h:12:26: error: ‘my::T has not been declared
Упрощенные файлы:
------ файл test1.h -------
#ifndef TEST_1_H
#define TEST_1_H
#include "test2.h"
namespace my
{
template <typename T = myclass>
int fun(char* str,int dim)
{
return my::T::fun(str,dim);
}
}
#endif
----- файл test2.h -------
#ifndef TEST_2_H
#define TEST_2_H
namespace my
{
struct myclass
{
static int fun(char* str,int dim);
};
}
#endif
------ файл test2.cpp --------
#include "test2.h"
namespace my
{
int myclass::fun(char* str,int dim)
{return 0;}
}
----- файл main.cpp -------
#include "test2.h"
#include "test1.h"
int main()
{}
Не могли бы вы помочь мне выяснить, где ошибка?
Заранее спасибо.
Имя T
является идентификатором аргумента шаблона. Он не живет в каком-либо пространстве имен. Имена аргументов или локальные переменные также не могут быть квалифицированы. Просто удалите my::
. Похоже, что версия с кодом my::myclass
которая не была шаблоном функции, оставила без изменений версию кода.
С квалификацией вы ссылаетесь на имя в области пространства имен:
namespace my {
struct T {};
template <typename T>
void f() {
my::T from_namespace;
T from_template_argument;
}
}