0

このコードをコンパイルするにはどうすればよいですか。次の行でブレーキをかけています。

自動値 = what.getObject();

#include<iostream>
using namespace std;

class CUP{
    public:
        void whatsHappening(){}
};

class MUG{
    public:
        void whatsHappening(){}
};

class CupThrower{
    public:
        CUP cp;
        CUP getObject(){ return cp;}
};

class MugThrower{
    public:
        MUG mg;
        MUG getObject(){return mg;}
};

template <typename T> void whatsHappening(T what){

    auto val = what.getObject(); //DOES NOT COMPILE
    val.whatsHappening();
}

int main(){
    CupThrower ct;
    MugThrower mt;
    whatsHappening(ct);
    whatsHappening(mt);
    return 0;
}

私はVS2008を使用してコンパイルしています。

4

4 に答える 4

11

Auto は VS2008 ではサポートされていません。VS2010 以降のバージョン、またはこの機能をサポートする別のコンパイラを使用してください。

于 2010-05-27T21:12:07.793 に答える
3

他の人はauto、それは VC9 にはないと言っていますが、これは一種の真実です。 auto現在の C++ 標準では、C++0x での意味とは異なります。現在の標準では、事実上、何の役にも立ちません。要するに、autoここで使用しようとしている方法を使用することはできません。

しかし、代替手段があります。このコードでは:

template <typename T> void whatsHappening(T what){

    auto val = what.getObject(); //DOES NOT COMPILE
    val.whatsHappening();
}

...あなたが抱えている問題はval未知のタイプです。Tがの場合、CUP を返しますCupThrowergetObject()同様に、 forMugThrowerは をgetObject()返しますMUG。コードの書き方では、getObject()の型だけに基づいて が返す型を知る方法がありませんT。したがって、解決策は、それを知る方法を追加することです。これを試して:

class CupThrower{
    public:
        typedef CUP ObjectType;
        ObjectType cp;
        ObjectType getObject(){ return cp;}
};

class MugThrower{
    public:
        typedef MUG ObjectType;
        ObjectType mg;
        ObjectType getObject(){return mg;}
};

によって返される型はgetObject()、囲んでいるクラスの一部になりました。whatsHappening()この情報を使用するように関数を変更できます。

template <typename T> void whatsHappening(T what){

    T::ObjectType val = what.getObject(); //DOES COMPILE!
    val.whatsHappening();
}

そして、すべてが再び世界でうまくいっています。

于 2010-05-27T21:22:40.733 に答える
3

Auto は C++0x にのみ存在する機能であるため、ほとんどの (すべてではないにしても) コンパイラではデフォルトで有効になっていません。コンパイラで適切なオプションを使用して有効にしましたか?

于 2010-05-27T21:05:36.050 に答える
-2

サイズがゼロの非関数オブジェクトを処理しようとしているため、コンパイルされません。

編集: VS2010 では問題なく動作します。

于 2010-05-27T21:08:47.800 に答える