Шаблоны C ++: неявное преобразование, нет соответствующей функции для вызова ctor - PullRequest
3 голосов
/ 13 апреля 2010
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 ]

8 голосов
/ 13 апреля 2010

Вы передаете двойной 1.1 неконстантной ссылке T&. Это означает, что вам нужно передать действительное значение lvalue в конструктор, например:

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

Заставьте конструктор принять константную ссылку (const T&), и это сработает, потому что вам разрешено привязывать временные значения (rvalues) к константным ссылкам, а 4.3 технически является временным двойным.

3 голосов
/ 13 апреля 2010

Это связано со ссылкой (&) в вашем определении конструктора. Вы не можете передать константу по ссылке, как эта, только переменную, как во втором примере.

2 голосов
/ 13 апреля 2010

Вы не можете использовать неконстантную ссылку на временный. Попробуйте изменить конструктор на

    test(const T& e)
    {
    }

или передать по значению:

    test(T e)
    {
    }
2 голосов
/ 13 апреля 2010

Нельзя связать двойной литерал с (неконстантным) двойным символом &.

Вы хотели передать его как T const & или вместо значения? (Либо работает для кода, который вы дали до сих пор.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...