2

ジェネリックスを使用してスマートポインタークラスを実装していますが、このクラスのユーザーに、次のような構文を使用してスマートポインターを適切に構築するように強制したいと思いました。

 MyReference<TestCls>(mytest3))

また

MyReference<TestCls> mytest4(new TestCls());

そのため、これを防ぐために、CTORで明示的なキーワードを使用しました。

MyReference aRef = NULL;

しかし、私の手に負えない不幸な状況のために、私は古いMSVC++4.1コンパイラを使用してコンパイルされたコードに取り組んでいます。明示的なキーワードを含めると、次のエラーが発生します。

MyReference.h(49):エラーC2501:'explicit':欠落しているdecl-specifiers
MyReference.h(51):エラーC2143:構文エラー:欠落している';' ''
MyReference.h(52)の前:エラーC2238:'の前に予期しないトークン:'
MyReference.h(52):エラーC2059:構文エラー:'int定数'

それらを追加すると、#define explicitこれらのエラーは消えます。これは、コンパイラにキーワードを無視させるための、私の側のハックでした。これは、明示が​​yonoldeコンパイラでサポートされていないことを意味していると思います。誰かがこれを確認できますか?これに対する回避策の知識を持っている人はいますか?

Merci Beaucoups、デニス。

4

1 に答える 1

2

このサイトには、これに対する回避策があります。つまり、次のとおりです。

残念ながら、古いコンパイラは「明示的」の使用をサポートしていない可能性があり、これは頭痛の種になる可能性があります。古いコンパイラで作業を続けていて、C ++標準をより適切にサポートするコンパイラを入手できない場合、最善の解決策は、1つの暗黙的な変換のみが行われるという事実を利用することです。与えられた値。これを利用するには、各タイプのオブジェクトを暗黙的に作成する中間クラスを使用してから、メインクラスにそのクラスからオブジェクトを暗黙的に作成させます。

class proxy
{
    public:
    proxy(int x) : x(x) {} ;
    getValue() { return x; }

    private:
    int x;

};

class String
{
    // this will be equivalent of explicit
    String(proxy x) { /* create a string using x.getValue(); */ }
}
于 2010-11-30T18:49:57.817 に答える