Почему специализации шаблонов функций не разрешены внутри класса?

После того, как я нашел ответы на многие мои вопросы по 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");
        }
    };
};
};

Ответы на вопрос(1)

Ваш ответ на вопрос