C ++模板:隐式转换,没有用于调用ctor的匹配函数

时间:2010-04-13 10:09:55

标签: c++ templates constructor

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

        test(T& e)
        {
        }

};

int main()
{

    test<double> d(4.3);

    return 0;
}

使用g ++ 4.4.1编译时出现以下错误:

g++ test.cpp -Wall -o test.exe
test.cpp: In function 'int main()':
test.cpp:18: error: no matching function for call to 'test<double>::test(double)
'
test.cpp:9: note: candidates are: test<T>::test(T&) [with T = double]
test.cpp:5: note:                 test<T>::test() [with T = double]
test.cpp:3: note:                 test<double>::test(const test<double>&)
make: *** [test.exe] Error 1

然而,这有效:

double a=1.1;
test<double> d(a);

为什么会这样? 是否有可能g ++无法将文字表达式1.1隐式转换为double? 感谢。

4 个答案:

答案 0 :(得分:8)

您将双1.1传递给非const引用T&。这意味着您必须将有效的左值传递给构造函数,例如:

double x = 4.3;
test<double> d(x);

使构造函数采用const引用(const T&)并且它可以工作,因为允许将临时值(rvalues)绑定到const引用,而4.3在技术上是临时引用。

答案 1 :(得分:3)

这是由于构造函数定义中的引用(&)。您不能像这样通过引用传递常量值,只能像第二个示例中那样传递一个变量。

答案 2 :(得分:2)

您不能将双文字绑定到(非常量)double&amp;。

你的意思是把它传递给T const&amp;还是以价值为代价? (要么适用于你目前给出的代码。)

答案 3 :(得分:2)

您不能将非const引用作为临时引用。尝试将构造函数更改为

    test(const T& e)
    {
    }

或传递价值:

    test(T e)
    {
    }