【发布时间】:2011-01-29 14:33:42
【问题描述】:
为什么下面没有编译错误?:
// T.h
template<class T> class X
{
public:
void foo(int a = 42);
};
// Main.cpp
#include "T.h"
#include <iostream>
template<class T> void X<T>::foo(int a = 13)
{
std::cout << a << std::endl;
}
int main()
{
X<int> x;
x.foo(); // prints 42
}
似乎 13 只是被编译器默默地忽略了。这是为什么呢?
奇怪的是,如果类模板定义在 Main.cpp 而不是头文件中,我确实会收到 default parameter redefinition 错误。
现在我知道如果它只是一个普通的(非模板)函数,编译器会抱怨这个。
标准对类模板成员函数或函数模板中的默认参数有什么规定?
【问题讨论】:
-
g++ 确实中止编译并出现错误。
-
当你说“......如果模板声明在......”我假设你的意思是类模板定义,即
template<class T> class x{....};。如果是这样,那么您是说用此模板类定义替换 include 指令会产生不同的编译器消息?这表明头文件中还有其他内容,即尝试将头文件的全部内容复制到包含指令所在的位置,并且大概然后您不会收到编译器警告? -
它可能与这个 VC++ 错误有关:connect.microsoft.com/VisualStudio/feedback/details/496593/…
-
@STingRaySC:这当然很奇怪。不过,看不到@Kirill 链接中的问题与它有什么关系。归根结底,如果您遇到不同的编译器错误,则预处理输出必须不同,即预处理器是这里的关键。尝试在每种情况下只吐出预处理的代码。您将能够发现一些差异。
标签: c++ visual-c++ templates compiler-construction