Я отчаянно пытаюсь заставить мои специализации работать, но у меня все еще есть не компилируемый код из-за неправильного вывода аргументов.Обратите внимание, что ошибки связаны не с определением шаблонов, а с применением несоответствующей операции в неправильной реализации шаблона.Сокращенный пример кода, демонстрирующего проблему:
struct Test { void Method() const {} };
template<typename T>
void Cmp(T _val) { _val > 1; }
template<>
void Cmp<const Test &>(const Test &_val) { _val.Method(); }
template<>
void Cmp<const char *>(const char *_val) { _val[2]; }
int main()
{
Test test1;
char test2[5];
Cmp(10); // ok, expected
Cmp(test1); // error in Cmp(T)?! but expecting to instantiate Cmp(const Test &)
Cmp(test2); // error in Cmp(T)?! but expecting to instantiate Cmp(const char *)
return 0;
}
Я действительно не хочу использовать явные вызовы, такие как Cmp<const Test &>(test1)
(это работает), поскольку AFAIK компилятор должен иметь возможность выводить аргументыавтоматически, и вся идея этих специализаций заключается в прозрачной диспетчеризации вызовов Cmp (в реальном коде я определяю операторы).Конечно, специализация по стоимости Cmp<Test>(Test)
работает, как и ожидалось, но для большого сложного класса, не являющегося POD, просто смешно передавать его по значению.специализация по ссылкам с использованием общего шаблона.Кажется, я упускаю что-то важное, но у меня действительно заканчиваются идеи, почему мой подход не работает и как я должен конструировать код, выражающий такую простую концепцию из мира без шаблонов C ++, как передача классов по ссылке.Конечно, Google оказался совершенно бесполезным для этой проблемы.^ _ ^ Я пробовал GCC 4.2.1 и 4.4.6.