У меня есть класс, который использует шаблоны. Это что-то вроде этого:
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);
, Я прав?
В вашем шаблоне класса 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)
должен работать в этом случае
Других решений пока нет …