Функция at также настраивается.C ++ попытается вывести аргумент типа шаблона.Это то, что происходит в вашем коде, так как вы не указываете тип в вызове, например a.at (1);
Этот код сгенерирует предупреждение, потому что он выводит тип какint без знака, а затем мы пытаемся передать size_t
template <typename T>
class A
{
int t;
public:
template<typename I> T& at(const I i)
{ return t;}
};
int main()
{
unsigned int j = 5;
size_t i = 10;
A<int> a;
a.at(j) = 4; // deduce template type as unsigned int
a.at(i) = 5; // generate warning
return 0;
}
РЕДАКТИРОВАТЬ: Я на самом деле пробовал этот код в VS, и он генерирует предупреждение.
Edit2: В коде, который я пробовал, size_t и unsigned int тоже 4 байта.Поэтому я немного покопался.В более старых версиях VS size_t определяется как typedef __w64 unsigned int size_t
. __W64 теперь устарела, но использовалась для обозначения типов, которые будут иметь другой размер (например, 64 против 32) при переходе на 64-битную платформу.__W64 заставляет компилятор видеть size_t
как другой тип.
В качестве эксперимента я набрал свой собственный unsigned int myint
и изменил строку size_t i = 10
на myint i = 10
.
, используя typedef __w64 unsigned int myint
, генерирует предупреждение где as typedef unsigned int myint`не выдает предупреждение.