使用模板函数而不是键入

时间:2015-06-25 01:39:35

标签: c++

我有这段代码:

#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”,因为它是类型化的参数。为什么要使用模板呢?

3 个答案:

答案 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&)

http://ideone.com/zOf1qX

答案 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 采用左值引用,与非模板构造函数相反。这是首选,因为身份转换(即无转换)优于资格转换。