Предполагая, что у меня есть два класса, первый для написания примитивных типов (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 С++ 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
(см. прокомментированную строку в первом фрагменте). Затем он выводит Wrote an int
на консоль.
Это как мой компилятор должен вести себя? Является ли стандарт С++ явно сказать, что только переопределения, определенные в одном классе (а не базовом классе), должны быть приоритетными по шаблонизированному методу?