为什么我不能有模板和默认参数?

shu*_*uji 9 c++ templates default-parameters

我在一个函数中更改了一个paremeter,使用模板接受任何类型的对象,但我不能将它与其他默认参数一起使用,是否有我遗漏的东西?

#include <string>
#include <iostream>

class MyClass {
    public:
    std::wstring msg = L"hey";
    MyClass(){};
};

class MyClass2{
    public:
    template<class T> MyClass2(T* t, int i);
};
template<class T>
MyClass2::MyClass2(T* t,int i=0){ std::wcout << t->msg << std::endl; }

int main(int argc, char **argv)
{
    MyClass mc;
    MyClass2 mc2(&mc);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

practice.cpp:16:32: error: redeclaration of 'MyClass2::MyClass2(T*, int)' may not have default arguments [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

我认为在模板中不使用默认值是合理的,但其他参数是否有原因?

Lig*_*ica 21

你当然可以 ; 将默认参数放在声明上,而不是定义上.

将缺省值放在定义的参数列表而不是声明中是一个额外的功能模板不可用:

[C++14: 8.3.6/4]:对于非模板函数,可以在稍后的同一范围内的函数声明中添加默认参数.[..]

我真的不知道为什么会有这种限制.

类似规则:

[C++14: 8.3.6/6]:除了类模板的成员函数之外,出现在类定义之外的成员函数定义中的缺省参数被添加到由类定义[...]中的成员函数声明提供的缺省参数集中.