我有以下代码,我真的犯了一个语法错误:
#include<iostream>
using namespace std;
template<typename Type1,typename Type2>
class Pair{
public:
Type1 first;
Type2 second;
Pair();
Pair(Pair<Type1,Type2>& obj);
};
template<class Type1,class Type2>
Pair<Type1,Type2>::Pair(){
first=Type1();
second=Type2();
}
template<class Type1,class Type2>
Pair<Type1,Type2>::Pair(Pair<Type1,Type2>& obj1){
cout<<"Inside the copy constructor\n";
obj1.first= //THIS IS THE PROBLEMATIC STMNT
}
int main()
{
/* Code here */
Pair<int,int> com1;
//Pair<complex1,complex2> com2(com1);
}
我在这个程序中找不到任何编译/运行时错误。但是,如果我取消注释main中调用复制构造函数的第二行,则会抛出编译器时间错误。我知道类在运行时根据类型实例化,但是在编译阶段,在模板化的类中检查这样的语法错误。为什么没有编译时错误呢? 我正在使用VS2008。
答案 0 :(得分:2)
continue terms;
使用默认构造函数,而Pair<complex1,complex2> com1;
使用复制构造函数。
由于没有第二行,从不使用复制构造函数,因此不会编译;编译器永远不会为它生成代码,因此它永远不会检查它是否可以编译。
答案 1 :(得分:1)
这是编译器错误。您可以用更简单的方式重现它:
template <class T>
void f()
{
= // should be an error, but is not in MSVC
}
int main()
{
}
这将在非MSVC编译器中创建一个类似error: expected primary-expression before '=' token
的诊断消息,但在MSVC中编译很快。
明显的原因是MSVC仍然没有按照C ++标准的要求实现two-phase lookup。正如MSVC开发人员Stephan T. Lavavej最近才在Visual C++ Team Blog中解释:
VC还没有实现三个C ++ 98/03功能:两阶段名称查找, 动态异常规范和导出。两阶段名称查找 在2015年仍未实现,但它在编译器团队的列表中 要做的事情,等待代码库现代化