我有以下一段代码,它不在Visual C++ 2015下编译,但在GCC 4.8.4下。我想知道哪个是对的?有问题的代码是在这里如下:将说明符覆盖为模板参数 - 是否有效?
template <class T> class ATemplate;
template <class R, class A1>
struct ATemplate<R(A1)>{ };
int main()
{
ATemplate<void(int)> x;
// ATemplate<void(int)override> y; //---Does not compile!!!
return 0;
}
这是错误的下面这里(或常量)使用覆盖为符。 GMock库中存在类似的代码,其中宏扩展用于生成模板参数(包括覆盖)以及实际函数签名。除去注释掉线时
的Visual C++ 2015产生以下错误:
x.cpp(11): error C2062: type 'int' unexpected
x.cpp(11): error C2976: 'ATemplate': too few template arguments
x.cpp(4): note: see declaration of 'ATemplate'
x.cpp(11): error C2079: 'y' uses undefined class 'ATemplate'
一下面提及的是覆盖处于自由函数(有效点)的上下文中无意义的答案 - 执行此这意味着GCC在这里是错误的。 常量说明符在这种情况下也是没有意义的(对于自由函数),但是允许(通过VC++)?此外,它还提到虚拟说明符应该只存在于声明中 - 这对这种情况没有任何影响(因为没有定义)。对于虚拟关键字,可以在派生中省略,因为代码编译没有区别,但对于覆盖情况,它不是好的,因为它有很大的区别。
当使用返回类型(ArgType ARG)...可能const或重写符作为宏参数(像GMock一样),由VCC施加的限制导致该代码不编译(显然为锵的情况下也是如此) 。哪个是对的?
该标准没有说明覆盖说明符不应该在这个上下文中使用(模板参数的上下文吗?),是吗?
来看由票我可能失去了一些东西很明显,但如果是你想要覆盖的功能? –
@KarolyHorvath这是不相干的 –
@KarolyHorvath,是的,这是无关紧要的。发布的代码很少,并产生错误。 –