0

目标:从具有 2 个模板参数的类继承。

错误

错误错误 C2143:语法错误:在 '<' 之前缺少 ','

编码

template< typename Type >
class AssetManager : public IsDerivedFromBase< Type, Asset* >
{
    // Class specific code here
};

您需要知道的事情: Asset 是一个仅用char*getter/setter包装 a 的类,IsDerivedFromBase将用于基本测试是否TypeAsset. 这些类集被隔离在自己的小型 Visual Studio 2012 项目中,一旦所有功能都经过彻底测试,它们将被集成到主项目中。

基于评论的一些编辑

谢谢你到目前为止的帮助,我真的很感激。以下是一些更具体的内容:

IsDerivedFromBase.h

#ifndef ISDERIVEDFROMBASE_H
#define ISDERIVEDFROMBASE_H

#include< iostream > // For access to NULL

namespace Fenrir
{
    template< typename Type, typename Base >
    class IsDerivedFromBase
    {
    private:
        static void Constraints( Type* _inheritedType )
        {
            Base* temp = NULL;

            // Should throw compiler error if
            // this assignment is not possible.
            temp = _inheritedType;
        }

    protected:
        IsDerivedFromBase( ) { void( *test )( Type* ) = Constraints; }
    };
}

#endif

注意:本课程基于我在一篇文章中读到的课程。从那以后,我找到了一种更好的方法来达到预期的效果;但是,我希望了解此错误的根源。

资产管理器.h"

#ifndef ASSETMANAGER_H
#define ASSETMANAGER_H

#include "IsDerivedFromBase.h"

namespace Fenrir
{
    template< typename Type >
    class AssetManager : public IsDerivedFromBase< Type, Asset* >
    {
        // Class specific code
    };
}

#endif

将特定于类的代码保持在最低限度,以使这篇文章尽可能整洁,如果需要更多信息,请告诉我,我可以将其添加:)。

4

2 回答 2

0

当编译器遇到一个它没有预料到的标识符时,该错误消息很常见,因此第一个猜测是当时编译器IsDerivedFromBase知道该错误消息(也许您没有包含适当的标头?)。或者,如果IsDerivedFromBase不是模板,编译器也会期望它后面有一个, (或;)。

于 2012-07-29T22:15:14.790 回答
0

解决了我的问题,这很有趣。因此,由于(来自 Jesse Good)的评论,我快速浏览了我的包含。由于这是一个小型的“快速启动”项目,我并没有真正关注它们。我不确切知道错误发生在哪里,但我发现AssetManager不知道IsDerivedFromBase所以我设置了以下代码块来解决这个问题,而不必到处写一堆 #include语句!

// Contact point houses all of the include files
// for this project to keep everything in one place.

#ifndef CONTACTPOINT_H
#define CONTACTPOINT_H

#include "Asset.h"
#include "Sprite.h" 
#include "IsDerivedFromBase.h"
#include "GenericManager.h"
#include "AssetManager.h"   

#endif

现在我只是将它包含在每个标题中,一切都很好。我已经编写 C++ 一年多了,从来没有遇到过这个问题,对于任何新编程的人来说,这是一个很好的学习课程。

谢谢大家的帮助 : )

于 2012-07-30T22:20:29.170 回答