1

私はこの問題にあまりにも長い間悩まされてきたので、全能のスタックに尋ねなければなりません。問題の単純さを許してください!

私は VisualStudio 2012 の BowlingGame 型に取り組んでおり、単体テストのバージョンを練習しています。テスト #2 のリファクタリング セクションの途中です。このセクションでは、回転するピンの数を節約するために、Game クラスにベクトルを追加します。

しかし、ベクター インクルードをヘッダーに追加すると、コンパイル エラーが発生しました。実際、コンパイラ エラーをスローしているのは単体テスト クラスです (ソース コードではありません)。

この問題は、単体テスト クラスの stdafx.h インクルードとソース コード ヘッダーの vector インクルードとの間の競合であると考えていますが、よくわかりません。マネージ/ネイティブ C++ の問題である可能性もありますか? この演習では、それらのいくつかを処理する必要がありました。

以下は、コンパイラ エラー (延々と続くので省略) と、これまでの 3 つのファイルのコードです。この問題を乗り越えるために私にできることを教えてください。この演習では「ベスト プラクティス」を使用しようとしています。そのため、怪しいと思われるものを他に見つけた場合は、お知らせください。

1>------ Build started: Project: BowlingGameUnitTests, Configuration: Debug Win32 ------
1>  BullseyeCoverage Compile C++ 8.7.21 Windows License 7978 
1>  Copyright (c) Bullseye Testing Technology 1990-2012
1>CL : Command line warning d9999: changing /clr:safe to -clr
1>  BowlingGameTest.cpp
1>c:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/include/xrefwrap(156): warning C4561: '__fastcall' incompatible with the '/clr' option: converting to '__stdcall'
1>c:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/include/xrefwrap(156): error C2953: 'std::_Result_of<_Ret(__stdcall &)(void),std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' : class template has already been defined
1>          c:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/include/xrefwrap(156) : see declaration of 'std::_Result_of<_Ret(__stdcall &)(void),std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>'
1>c:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/include/xrefwrap(156): error C2953: 'std::_Result_of<_Ret(__stdcall *)(void),std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' : class template has already been defined
1>          c:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/include/xrefwrap(156) : see declaration of 'std::_Result_of<_Ret(__stdcall *)(void),std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>'

ゲーム.h:

#pragma once
#include <vector>
using namespace std;

class Game
{
public:
    Game(void);
    ~Game(void);
    void roll( int pins );
    int score();

private:
    int totalScore;
    vector<int> rolls;
    int currentRoll;
};

ゲーム.cpp:

#include "stdafx.h"
#include "Game.h"

Game::Game(void)
{
    totalScore = 0;
    currentRoll = 0;
}

Game::~Game( void )
{
}

void Game::roll( int pins )
{
    totalScore += pins;
    rolls.push_back(pins);
}

int Game::score()
{
    return totalScore;
}

BowlingGameTest.cpp:

#include "stdafx.h"
#include "../BowlingGame/Game.h"

using namespace System;
using namespace System::Text;
using namespace System::Collections::Generic;
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;

namespace BowlingGameUnitTests
{
    [TestClass]
    public ref class BowlingGameTest
    {
    private:
        Game* game;

    public: 
        [TestInitialize()]
        void MyTestInitialize() 
        {
            game = new Game();
        }

        void rollMany( int frames, int pins ) 
        {
            for (int i = 0; i < frames; i++)
            {
                game->roll(pins);
            }
        }

        [TestMethod]
        void gutterGame()
        {
            rollMany(20, 0);
            Assert::AreEqual<int>(0, game->score());
        }

        [TestMethod]
        void testAllOnes()
        {
            rollMany(20, 1);
            Assert::AreEqual<int>(20, game->score());
        }
    };
}
4

1 に答える 1

1

pstrjdsに感謝します!

回答パート 1: 私の単体テスト プロジェクトは C++/CLI プロジェクトであるため、std::vector を cliext vector に変更します。

回答パート 2: ソリューションを再構成します。現在、それはネイティブ ソースおよびマネージド ユニット テストですが、それは多くの厄介な問題を引き起こします。ネイティブ ソースとネイティブ ユニット テストに変更されます。

于 2012-12-03T20:01:55.370 に答える