我有这段代码:
#include <iostream>
#include <string>
class Foo {
public:
Foo(){};
template<typename T>
Foo (T&) {
std::cout << "template" << std::endl;
}
Foo(Foo&) {
std::cout << "copy" << std::endl;
}
Foo(const Foo&) {
std::cout << "copy2" << std::endl;
}
};
int main(){
Foo f;
Foo f2 (f);
}
打印“副本”,这是正确的。
但是,如果我删除Foo(Foo&)
:
class Foo {
public:
Foo(){};
template<typename T>
Foo (T&) {
std::cout << "template" << std::endl;
}
//Foo(Foo&) {
// std::cout << "copy" << std::endl;
//}
Foo(const Foo&) {
std::cout << "copy2" << std::endl;
}
};
int main(){
Foo f;
Foo f2 (f);
}
打印“模板”。我希望它打印“copy2”,因为它是类型化的参数。为什么要使用模板呢?
答案 0 :(得分:0)
Foo f;
f
不是const
的{{1}}对象。所以它的类型与以下函数匹配,它将打印模板。
Foo
如果您按如下方式定义f,它将按预期打印。
template<typename T>
Foo (T&) {
std::cout << "template" << std::endl;
}
答案 1 :(得分:0)
出于同样的原因,您的第一个代码示例未打印[(.*)]
。您引用的copy2
不是f
,因此编译器首先尝试非const引用。重载匹配匹配const
给出完全匹配,而template<typename T=Foo> Foo(T&)
需要对传递的参数进行cv调整。
尝试以下方法:
Foo(const Foo&)
答案 2 :(得分:0)
为了执行重载解析,编译器需要使用模板参数推导来评估构造函数模板。所以它创建了一个这样的构造函数:
body
{
background: -webkit-linear-gradient(rgb(180, 139, 170), rgb(52, 10, 55) ); /* For Safari 5.1 to 6.0 */
background: -o-linear-gradient(rgb(180, 139, 170), rgb(52, 10, 55) ); /* For Opera 11.1 to 12.0 */
background: -moz-linear-gradient(rgb(180, 139, 170), rgb(52, 10, 55) ); /* For Firefox 3.6 to 15 */
background: linear-gradient(rgb(180, 139, 170), rgb(52, 10, 55) ); /* Standard syntax */
background-repeat: no-repeat;
-webkit-background-size: cover;
-moz-background-size: cover;
background-size: 100% 100%;
height:100%;
width:100%;
}
.topper
{
width:%100;
}
.top1
{
margin-left:fixed;
margin-right: auto;
width: 20%;
}
.top2
{
margin-left:auto;
margin-right: auto;
width: 50%;
}
.top3
{
margin-left:auto;
margin-right: fixed;
width: 20%;
}
#primary_nav_wrap
{
width:100%;
background-image: url('link_back.png');
background-repeat: no-repeat;
background-size: 80%;
background-position:center;
}
#primary_nav_wrap ul
{
position:relative;
}
#primary_nav_wrap ul a
{
color:white;
text-decoration:none;
font-weight:700;
font-size:12px;
line-height:32px;
padding:0 15px;
font-family:"HelveticaNeue","Helvetica Neue",Helvetica,Arial,sans-serif;
}
#primary_nav_wrap ul li
{
position:relative;
float:center;
margin-left:0;
padding:0;
display:inline;
}
#primary_nav_wrap ul li:hover
{
background:#aaa
}
#primary_nav_wrap ul ul
{
/*
display:none;
*/
}
此构造函数对非const 采用左值引用,与非模板构造函数相反。这是首选,因为身份转换(即无转换)优于资格转换。