Почему специализации шаблонов функций не разрешены внутри класса?
После того, как я нашел ответы на многие мои вопросы по stackoverflow, я столкнулся с вопросом, на который я могуНе могу найти ответ, и я надеюсь, что кто-то готов помочь мне!
Моя проблема в том, что я хочу сделать явную шаблонизацию функции внутри класса в C ++. Мой компилятор (g ++) и взгляд на стандарт C ++ (§14.7.3) говорит мне, что эта специализация должна быть сделана в пространстве имен, в котором объявлен класс. Я понимаю, что это означает, что я не могу поместить специализацию в класс, но я неНе вижу смысла этого ограничения! Кто-нибудь знает, есть ли веская причина не допускать специализаций внутри класса?
Я знаю, что есть обходные пути, например, поместить функцию внутри структуры, но я хочу понять, почему язык имеет такой дизайн. Если есть веская причина для запрета использования специальных функций внутри класса, я думаю, я должен знать это, прежде чем пытаться обойти это.
Заранее спасибо!
Чтобы сделать мой вопрос немного более точным: Вот код из тестового примера, который иллюстрирует, что я хочу сделать:
#include
namespace MalinTester {
template
class SpecializationTest {
public:
SpecializationTest() {
privateVariable = 5;
};
virtual ~SpecializationTest() {};
void execute() {
execute();
};
private:
int privateVariable;
template
static void execute() {
printf("This is the general case. Current dim is %d. The private variable is %d.\n", currentDim, privateVariable);
execute();
}
template
static void execute() {
printf("This is the base case. Current dim is 0.\n");
}
};
Это невозможно; g ++ говорит:
SpecializationTest_fcn.h:27: error: explicit specialization in non-namespace scope ‘class MalinTester::SpecializationTest’
SpecializationTest_fcn.h:28: error: template-id ‘execute’ in declaration of primary template
Если я помещу функцию execute вне класса, в пространство имен MalinTester, это будет выглядеть так:
#include
namespace MalinTester {
template class SpecializationTest {};
template
void execute() {
printf("This is the general case. Current dim is %d. The private variable is %d.\n", currentDim, privateVariable);
execute();
}
template
void execute() {
printf("This is the base case. Current dim is 0.\n");
}
template
class SpecializationTest {
public:
SpecializationTest() {};
virtual ~SpecializationTest() {};
void execute() {
MalinTester::execute();
};
private:
int privateVariable = 5;
};
};
};
и я не могу использовать privatevariable в шаблонных версиях execute, так как это private в классе. я действительнохочу это личное, так как я хочу, чтобы мои данные были как можно более инкапсулированы.
Конечно, я могу отправить privateVariable в качестве аргумента функции, но я думаю, что было бы прекраснее избежать этого, и что меня действительно интересует, так это то, что у стандарта C ++ есть веская причина не разрешать явную специализацию, как в первом Пример кода выше.
@Arne Mertz: это обходной путь, который я пробовал, но это не такТакже нельзя использовать privateVariable. И больше всего мне интересно, стоит ли так поступать. Насколько я'Мне не разрешено делать специализацию функций-членов, может быть, я не долженТакже можно специализироваться на функциях, инкапсулированных в структуры внутри класса.
#include
namespace MalinTester {
template
class SpecializationTest {
public:
SpecializationTest() {
privateVariable = 5;
};
virtual ~SpecializationTest() {};
void execute() {
Loop::execute();
};
private:
int privateVariable;
template
struct Loop {
static void execute() {
printf("This is the general case. Current dim is %d.\n", currentDim);
Loop::execute();
}
};
template
struct Loop {
static void execute() {
printf("This is the base case. Current dim is 0.\n");
}
};
};
};