-3

から継承できるDice実際のサイコロとテンプレートクラスの動作を模倣する小さなクラスを作成Singletonしました。Dice私はoperator<<クラスのために書いたDiceが、どういうわけかコンパイラはそれを見つけるのに問題がある。<<の演算子をオーバーロードしましたが、Diceこれはいくつかのメソッドから返され、持っていると便利です。Sinlgeton<Dice>std::vector<int>Dice

私はubuntuで使用Qt creator 2.5します。gcc 4.7

/home/USER/programming/cpp_yahtzee/main.cpp:12:エラー:'std :: operator <<>((*&std :: cout)、((const char *)の'operator<<'に一致しません"hello"))<<(&Singleton :: Instance())-> Dice :: getLastThrow()'</ p>

これは、このエラーを生成するコードです:

std::cout << "hello" << Dice::Instance().getLastThrow();

編集 それでも、これはまったくエラーなしで期待されたものを出力します: std::cout << Dice::Instance() 多分それは私のコンパイラの問題ですgcc/g++ 4.7(試しgcc/g++ 4.6.3てみましたが効果は同じです)?

私のsinlgetonクラス

template <typename T>
class Singleton
{
public:
    static T& Instance();
    Singleton() {}
private:

    //declare them to prevent copies
    Singleton(Singleton const&);
    void operator=(Singleton const&);

};

template<typename T>
T& Singleton<T>::Instance()
{
    static T _instance;
    return _instance;
}

サイコロクラス:

    class Dice : public Singleton<Dice>
    {
    private:
        std::vector<int> _lastThrow;
    public:
        Dice();
        std::vector<int> generateThrow();
        friend std::ostream& operator<<(std::ostream& os, const Dice& dice);
        friend std::ostream& operator<<(std::ostream& os, const Singleton<Dice>& dice);
        friend std::ostream& operator<<(std::ostream& os, const std::vector<int>& vect);

        //accessor method - returning last throw
        const std::vector<int>& getLastThrow();

        //rethrowing {1,4} - dice #1 and #4
        std::vector<int> Rethrow(const std::vector<int>& objects);
    };

std::ostream& operator<<(std::ostream& os, const Dice& dice)
{
    for (std::vector<int>::const_iterator it = dice._lastThrow.begin();  it != dice._lastThrow.end(); ++it) {
        os << *it;
    }
    return os;
}
std::ostream& operator<<(std::ostream& os, const Singleton<Dice>& dice)
{
    for (std::vector<int>::const_iterator it = dice.Instance().getLastThrow().begin();  it != dice.Instance().getLastThrow().end(); ++it) {
        os << *it;
    }
    return os;

}

std::ostream& operator<<(std::ostream& os, const std::vector<int>& vect)
{
    for (std::vector<int>::const_iterator it = vect.begin();  it != vect.end(); ++it) {
        os << *it;
    }
    return os;
}

std::vector<int> Dice::generateThrow()
{
    static std::vector<int> v(5);

    for (std::vector<int>::iterator it = v.begin();  it != v.end(); ++it) {
        (*it) = rand()%(DICE_MAX)+1;
    }
    _lastThrow = v;
    return v;
}

今、私はこのようなことをすることはできません:

std::cout << Dice::Instance().generateThrow();

編集 IlyaLavrenovのメソッドは機能していますが、ローカル変数を作成する必要があるため、これは私が望むものではありません。Singletonクラスのどこかに問題があります。

4

3 に答える 3

0

タイプミスとは何か関係がありますかDice::Instane-> Dice::Instance

于 2012-07-17T12:33:43.620 に答える
0
#include <iostream>
#include <vector>

template <typename T>
class Singleton
{
public:
    static T& Instance();
    Singleton() {}
private:

    //declare them to prevent copies
    Singleton(Singleton const&);
    void operator=(Singleton const&);

};

template<typename T>
T& Singleton<T>::Instance()
{
    static T _instance;
    return _instance;
}

class Dice : public Singleton<Dice>
{
private:
    std::vector<int> _lastThrow;
public:
    Dice()
    {
        for (int i = 0; i < 10; ++i)
            _lastThrow.push_back(i);
    }
    std::vector<int> generateThrow();

    //accessor method - returning last throw
    const std::vector<int>& getLastThrow()
    {
        return _lastThrow;
    }

    //rethrowing {1,4} - dice #1 and #4
    std::vector<int> Rethrow(const std::vector<int>& objects);
};

std::ostream& operator<<(std::ostream& os, const Dice& dice)
{
    for (std::vector<int>::const_iterator it = dice.Instance().getLastThrow().begin();  it != dice.Instance().getLastThrow().end(); ++it) {
        os << *it;
    }
    return os;
}
std::ostream& operator<<(std::ostream& os, const Singleton<Dice>& dice)
{
    for (std::vector<int>::const_iterator it = dice.Instance().getLastThrow().begin();  it != dice.Instance().getLastThrow().end(); ++it) {
        os << *it;
    }
    return os;

}

std::ostream& operator<<(std::ostream& os, const std::vector<int>& vect)
{
    for (std::vector<int>::const_iterator it = vect.begin();  it != vect.end(); ++it) {
        os << *it;
    }
    return os;
}

std::vector<int> Dice::generateThrow()
{
    static std::vector<int> v(5);

    for (std::vector<int>::iterator it = v.begin();  it != v.end(); ++it) {
        (*it) = rand()%(354535)+1;
    }
    _lastThrow = v;
    return v;
}

int main()
{
    Singleton<Dice> a;
    std::cout << a << std::endl;

    return 0;
}

コードにいくつかの変更を加えて、コンパイルがうまくいくようになりました。そして演算子 << もうまくいきます

于 2012-07-17T12:26:42.027 に答える
-3

IDE は、インスタンスの Eclipse や仮想スタジオなどの一部の「const」演算子を異なるものとして解釈することがあります。パラメータ 'const' からの jsut の削除

std::ostream& operator<<(std::ostream& os, std::vector<int>& vect)

便利だと思いますが、そうでない場合は、使用しているコンパイラのバージョンと IDE を教えてください。

于 2012-07-17T12:24:49.000 に答える