奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"

Strange code throwing compile error template< J, int aSize=10> C2143: syntax error : missing ';' before '<'

本文关键字:lt 错误 C2143 gt 语法 代码 编译 int aSize      更新时间:2023-10-16

我正在研究一个有趣的问题。

客户有在VS2013中构建的代码,他们有大量的宏,在一个案例中,我不明白为什么。 Visual Studio 2013 Platform 工具集 V120xp。

template< class J, int a_iSize = 10 >
struct testme {
private:
vector< J > data;
};

上面的代码抛出错误:

1>c:\customers\xxx.h(334(:错误 C2143:语法错误:在"<"之前缺少";">

但是,如果他们通过用宏包装结构来更改结构testme的所有用法,如下所示:

#define TEST_ME testme

代码编译良好。

我是模板的新手,想知道我是否缺少一些基础级别。

我大致了解模板的概念,但这是一个有趣的细微差别。

我需要向下挖掘并创建一个较小的测试用例。 目前,上面的代码片段是较大代码块的一部分,因此调用中可能存在导致此问题的内容。

此外,我只能运行"C"预处理器并比较两个*.i文件。 这可能会显示一些东西。

客户用宏包装模板函数的用例很有趣。当我看到这个时,我想"缺少一些东西,如果这样做,可以消除宏的使用。 这就是我要找的东西。

对于此代码:

template< class J, int a_iSize = 10 >
struct testme {
private:
vector< J > data;
};
int main()
{
testme<int> t;
}

以下错误:

error C2143: syntax error : missing ';' before '<

此处重复。

可能发生的情况是缺少指定vector位于std命名空间中。

这就是为什么头文件应该使用命名空间名称,而不是依赖某些外部文件来提供此名称的原因。

此外,文件中应包含<vector>标头。

#include <vector> 
template< class J, int a_iSize = 10 >
struct testme {
private:
std::vector< J > data;
};
int main()
{
testme<int> t;
}

以下编译没有错误。