Почему C++ предпочитает этот шаблонный метод перегруженному методу?

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

12
задан Cygon 7 June 2012 в 12:34
поделиться