2つのクラスがあると仮定します。最初のクラスはプリミティブ型(、、、bool
などint
)float
を記述するためのもので、2番目のクラスは最初のクラスを拡張して複雑な型も書き込むためのものです。
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
ます(最初のスニペットのコメント化された行を参照)。次にWrote an int
、コンソールに出力します。
これは私のコンパイラがどのように動作するべきですか?C ++標準では、同じクラスで定義された(基本クラスではなく)オーバーロードのみがテンプレート化されたメソッドよりも優先されると明示的に規定されていますか?