1

我在这个问题上卡了太久,必须问全能的 Stack。请原谅问题的简单性!

我正在使用 VisualStudio 2012 中的 BowlingGame kata 来练习他们的单元测试版本。我在测试#2 的重构部分的中间,我在我的 Game 类中添加了一个向量,以保存滚动的引脚数。

然而,当我将向量包含添加到我的头文件时,我得到了一个编译器错误!事实上,是我的单元测试类引发了编译器错误(不是我的源代码)。

我认为问题是单元测试类中的 stdafx.h 包含与源代码标头中的向量包含之间的冲突,但我不确定。它也可能是托管/本机 C++ 问题?在这个练习中,我不得不完成其中的一些。

下面是编译器错误(缩写,因为它一直在继续)和到目前为止我的三个文件的代码。请让我知道我能做些什么来解决这个问题。我正在尝试在此练习中使用“最佳实践”,因此,如果您发现任何其他看起来可疑的内容,请告诉我!

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 部分:将 std::vector 更改为 cliext vector,因为我的单元测试项目是 C++/CLI 项目。

回答第 2 部分:重新配置解决方案。目前,它是本地源代码和托管单元测试,但这会导致很多小问题。将更改为原生源代码和原生单元测试。

于 2012-12-03T20:01:55.370 回答