6

我知道这是一种不好的形式,应该在声明中指定默认值,但是如果您愿意,请放纵我一会儿.. 为什么会编译?到底发生了什么?

#include <iostream>
using namespace std;

class test
{
public:
    test(int n);
};

test::test(int n = 666)
{
    cout << n;
}

int main()
{
    test t;

    cin.sync();
    cin.ignore();

    return 0;
}

输出: 666

.. 模板如何影响同一段代码?

template <class T>
class test
{
public:
    test(int n);
};

template <class T>
test<T>::test(int n = 666)
{
    cout << n;
}

int main()
{
    test<int> t;

    cin.sync();
    cin.ignore();

    return 0;
}

错误:没有合适的默认构造函数可用

感谢您的时间!

4

2 回答 2

4

看起来 C++ 规范特别允许第一种情况而不允许第二种情况!

引用 C++ 规范(§8.3.6/4):

对于非模板函数,可以在相同范围内的函数声明中添加默认参数。

所以看起来对于非模板函数,您确实可以稍后引入默认参数。不过,不知道为什么这不适用于模板!

于 2011-07-24T07:35:40.847 回答
1

第一种情况是标准允许的;我记得这是@Johannes 提出的,@Nawaz 回答了这个问题。(编辑:这是相关的问题)。

不允许该template版本的原因是因为template仅在显式实例化时才调用函数。在您的情况下,编译器将声明视为,

test<int> t;

-->编辑:它可能因编译器而异。在 gcc中它工作正常。<--

为什么它可能在某些编译器中不起作用可能是因为您没有显式实例化为t(N),编译器将无法解析test<T>::test(int n = 666)。因此它寻找没有参数的默认构造函数,但没有找到;从而导致错误。

于 2011-07-24T07:44:42.507 回答