Предполагая, что у меня есть два класса, первый для написания примитивных типов ( bool
, int
, float
и т. д.), а второй расширяет первый также писать сложные типы:
struct Writer {
virtual void Write(int value) = 0;
};
struct ComplexWriter : public Writer {
template <typename TValue> void Write(const TValue &value) {
boost::any any(value);
Write(any);
}
//virtual void Write(int value) = 0; // see question below
virtual void Write(const boost::any &any) = 0;
};
Идея состоит в том, что если кто-то вызовет myWriter.Write(someIntValue);
, перегрузка int получит приоритет над шаблонным методом.
Вместо этого мой компилятор (Visual C++ 11.0 RC) всегда выбирает метод шаблона. Следующий фрагмент кода, например, выведет Wrote any
на консоль:
struct ComplexWriterImpl : public ComplexWriter {
virtual void Write(int value) { std::cout << "Wrote an int"; }
virtual void Write(const boost::any &any) { std::cout << "Wrote any"; }
};
void TestWriter(ComplexWriter &writer) {
int x = 0;
writer.Write(x);
}
int main() {
ComplexWriterImpl writer;
TestWriter(writer);
}
Поведение внезапно изменится, когда я объявлю метод Write(int)
в ComplexWriter.
(см. закомментированную строку в первом фрагменте). Затем он печатает Записал int
на консоль.
Так должен вести себя мой компилятор? Говорит ли стандарт C++ явно, что только перегрузки, определенные в том же классе (а не в базовом классе), должны иметь приоритет над шаблонным методом?