Конструктор, перегружающий двусмысленность при попытке поддержки литералов

Код

#include <iostream>

template <typename Type>
class MyContainer
{
private:
Type contained;
public:
MyContainer<Type>(Type & a): contained(a) { std::cout << "&\n"; }
MyContainer<Type>(Type   a): contained(a) { std::cout << "_\n"; }
};

class Epidemic
{
private:
int criticality;
public:
Epidemic(int c): criticality(c);
};

int main()
{
// using objects //
Epidemic ignorance(10);
MyContainer<Epidemic> testtube(ignorance); // should print "&"; error instead

// using primitive //
double irrationalnumber = 3.1415;
MyContainer<double> blasphemousnumber(irrationalnumber); // should print "&"; error instead

// using literal //
MyContainer<double> digits(123456789.0); // prints "_"}

Описание

MyContainer<Type>(Type & a) предназначен для большинства всего. Тем не менее, он не будет работать с литералами (например, 1.732). Вот почему я добавил MyContainer<Type>(Type a), Однако, добавив это, я получаю неоднозначность, потому что не-литералы могут использовать любой конструктор.


Вопрос

Есть ли способ удовлетворить все параметры (как литеральные, так и не литеральные), данные конструктору?

1

Решение

Просто измените параметр типа значения на const ссылка:

template <typename Type>
class MyContainer
{
private:
Type contained;
public:
MyContainer<Type>(Type & a): contained(a) { std::cout << "&\n"; }
MyContainer<Type>(const Type& a): contained(a) { std::cout << "_\n"; }
// ^^^^^     ^
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector