Шаблонный шаблонный шаблонный аргумент

У меня есть класс, который использует шаблоны. Это что-то вроде этого:

template <typename T>
class a
{

public:
    a(T arg);
    a<T> func(a arg); // This seems to work, but...
    a<T> func(a<T> arg); // ...should I be doing this instead?

private:
    T local;
};

Обратите внимание на два шаблона функций для func, Оба скомпилируют (конечно, не одновременно), но какой из них правильный, или это не имеет значения? Во первых, я указал, что class a является аргументом... В этом первом случае можно использовать другой тип вместо T... Например, я могу сделать это:

a<float> b;
a<int> c;
a<int> d;
d = c+ b;

Я предполагаю, что ответ "нет", потому что он не компилируется!

Во втором случае ясно, что аргумент должен иметь тот же тип шаблона.

Из-за того, что я обсуждал выше, я предполагаю, что компилятор на самом деле интерпретирует a<T> func(a arg); как a<T> func(a<T> arg);, Я прав?

1 ответ

Решение

В вашем шаблоне класса a средства a<All the tempalte args here> т.е. a<T>

Так что обе ваши функции одинаковы.

Если вы хотите предоставить другой тип, вы должны использовать функцию шаблона

template <typename T> {
class a {
    template<typename U>
    a<T> func(a<U> arg);
}

Вы также можете рассмотреть возможность возврата std::common_type<T, U>::type но в вашем случае он не скомпилируется, потому что общий тип для float а также int является float

a<float> x = a<int>(1) + a<float>(8)

должен работать в этом случае

Другие вопросы по тегам