Пожалуйста, примите во внимание этот код:
#include <iostream>
template<typename T>
class SomeClass;
template<>
class SomeClass<int>
{
public:
enum SomeEnum { A=1, B=2 };
};
template<>
class SomeClass<double>
{
public:
enum SomeEnum { A=4, B=5 };
};
int main()
{
std::cout << SomeClass<int>::SomeEnum::A << std::endl;
std::cout << SomeClass<double>::SomeEnum::A << std::endl;
}
(я проверял его на http://cpp.sh/7xc3)
Выходные значения 1 и 4. Как вариант, я мог бы дать один из нихперечислимые значения C и D или, может быть, B и C.
Следовательно, нет однозначной вероятности того, что SomeClass::SomeEnum::A
должно быть.Теперь это целочисленные значения, но также учтите, что SomeClass<int>::SomeEnum::A != SomeClass<double>::SomeEnum::A
.
Это объяснение того, почему то, что вы просите, может не сработать.Я думаю, вы имеете в виду, что вы пишете шаблонный класс в одной реализации, и в таком случае это не будет двусмысленным.Но это просто общий способ сделать это, а не технический смысл.В конце концов, SomeClass<int>
- это другой класс от до SomeClass<double>
в целом.Для машины это два совершенно разных класса, таких как SomeClassInt
и SomeClassDouble
, и, как я показал выше, они могут иметь совершенно разные реализации.
Кроме того, даже если вы в целом заявляете одну реализацию, другуюВ дальнейшем человек мог бы написать специализированную реализацию, которая бы полностью работала с вашим кодом, не переписывая его.Таким образом, существующая единая реализация не будет означать, что в будущем она будет однозначной.Это было бы серьезной проблемой.
Тем не менее, ответ на вопрос в вашей ссылке обеспечивает хороший способ решения проблемы с использованием общего базового класса.Есть ли причина, по которой вы его не используете?
В любом случае, подумайте о значении перечисления здесь в процессе органического мышления ООП.У вас есть пример, где вам это нужно?Давайте поговорим об этом, может быть, проблема XY.