目标:从具有2个模板参数的类继承。
错误
错误错误C2143:语法错误:在'<'
之前缺少','
守则
template< typename Type >
class AssetManager : public IsDerivedFromBase< Type, Asset* >
{
// Class specific code here
};
您需要了解的事项:资产是一个只使用getter / setter封装char*
的类,而IsDerivedFromBase
将用于基本测试是否有Type
{ {1}}是Asset
的衍生物。这些类集在自己的小型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
注意:这个课程是基于我在一篇文章中读到的课程。从那以后我发现了一种更好的方法来达到预期的效果;但是,我希望了解这个错误源自何处。
AssetManager.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
将类特定代码保持在最低限度,以使此帖子尽可能整洁,如果需要更多信息,请告诉我,我可以将其添加到:)。
答案 0 :(得分:0)
当编译器遇到它不期望的标识符时,该错误消息很常见,因此首先猜测IsDerivedFromBase
当时<{1}} <编译器你没有包含适当的标题?)。或者,如果IsDerivedFromBase
不是模板,编译器也会期望,
(或;
)。
答案 1 :(得分: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 ++并且从未遇到过这个问题,这对于任何新的编程来说都是一个很好的教训。
感谢大家的帮助:)。