Я хочу иметь шаблон структуры, который определяется конкретными значениями его компонентов, передаваемых ему во время конструирования, чтобы различные значения создавали разные типы данных C ++, и для этого могут быть полезны нестандартные параметры шаблона.Примерно так (просто простой пример, чтобы показать проблему, реальная структура будет более сложной):
enum ElementType
{
TYPE1,
TYPE2
};
template<ElementType elementType, int size>
struct DataType
{
DataType(ElementType et = elementType, int s = size):
elementType_(et),
size_(s)
{
}
ElementType elementType_;
int size_;
};
int main()
{
auto d1 = DataType(ElementType::TYPE1, 1);
}
Я пытаюсь построить это с помощью g ++ - 8 -std = c ++ 17, и это даетменя следующая ошибка:
./main.cpp:23:42: error: class template argument deduction failed:
auto d1 = DataType(ElementType::TYPE1, 1);
^
../main.cpp:23:42: error: no matching function for call to ‘DataType(ElementType, int)’
../main.cpp:12:2: note: candidate: ‘template<ElementType elementType, int size> DataType(ElementType, int)-> DataType<elementType, size>’
DataType(ElementType et = elementType, int s = size):
^~~~~~~~
../main.cpp:12:2: note: template argument deduction/substitution failed:
../main.cpp:23:42: note: couldn't deduce template parameter ‘elementType’
auto d1 = DataType(ElementType::TYPE1, 1);
^
../main.cpp:23:42: error: expression list treated as compound expression in functional cast [-fpermissive]
../main.cpp:23:42: warning: left operand of comma operator has no effect [-Wunused-value]
Обратите внимание, что я не могу использовать аргументы шаблона типа, так как два типа аргументов являются фиксированными (ElementType
и int
), но DataType(ElementType::TYPE1, 1)
должны быть разнымитип чем DataType(ElementType::TYPE1, 2)
и DataType(ElementType::TYPE1, 1)
должен отличаться от DataType(ElementType::TYPE2, 1)
.