为什么没有模板和默认参数? [英] Why can't I have template and default arguments?
问题描述
我使用模板将函数中的参数表更改为可以接受任何类型的对象,但是我无法将其与其他默认参数结合使用,是否缺少某些内容?
I changed a paremeter in a function to accept any kind of object using a template but I can't use it in conjunction with other default parameters, is there something I am missing?
#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;
}
输出:
practice.cpp:16:32: error: redeclaration of 'MyClass2::MyClass2(T*, int)' may not have default arguments [-fpermissive]
我认为在模板中不使用默认值是合理的,但是是否有其他参数的原因呢?
I thought it was reasonable to not use default values in the template but is there a reason for the other parameters?
推荐答案
您当然可以;将默认参数放在声明上,而不是定义上.
You certainly can; put the default argument on the declaration, not the definition.
将默认值放置在定义的参数列表中,而不是在声明的参数列表中,这是添加的额外功能,不适用于函数模板:
Putting the default in the definition's argument list instead of the declaration's is an added extra that is not available for function templates:
[C++14: 8.3.6/4]:
对于非模板函数,可以在同一作用域的函数的后续声明中添加默认参数. [..]
[C++14: 8.3.6/4]:
For non-template functions, default arguments can be added in later declarations of a function in the same scope. [..]
我真的不知道为什么有这个限制.
I don't really know why this restriction is in place.
类似规则:
[C++14: 8.3.6/6]:
除类模板的成员函数外,出现在类定义之外的成员函数定义中的默认参数将添加到由类定义中的成员函数声明提供的一组默认参数中. [..]
[C++14: 8.3.6/6]:
Except for member functions of class templates, the default arguments in a member function definition that appears outside of the class definition are added to the set of default arguments provided by the member function declaration in the class definition [..]
这篇关于为什么没有模板和默认参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!