编译器没有为类的构造函数抛出错误有语法错误

时间:2015-10-02 12:41:50

标签: c++ templates

我有以下代码,我真的犯了一个语法错误:

#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。

2 个答案:

答案 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年仍未实现,但它在编译器团队的列表中   要做的事情,等待代码库现代化