Сегодня один из моих друзей сказал мне, что следующий код компилирует хорошо на его Visual Studio 2008:
#include <vector>
struct A
{
static int const const_iterator = 100;
};
int i;
template <typename T>
void PrintAll(const T & obj)
{
T::const_iterator *i;
}
int main()
{
std::vector<int> v;
A a;
PrintAll(a);
PrintAll(v);
return 0;
}
Я обычно использую g ++, и он всегда отказывается передавать второй PrintAll () вызов. Как я знаю для этой проблемы, g ++ делает стандартный способ перевести шаблон.
Так, мое знание неправильно, или действительно ли это - расширение VS2008?
Это вовсе не расширение.
VC++ никогда не реализовывал должным образом интерпретацию двух фаз:
VC++ никогда не реализовывал первую фазу... это неудобно, так как это означает не только то, что он принимает код, который не соответствует требованиям, но и то, что он производит совершенно другой код в некоторых ситуациях.
void foo(int) { std::cout << "int" << std::endl; }
template <class T> void tfoo() { foo(2.0); }
void foo(double) { std::cout << "double" << std::endl; }
int main(int argc, char* argv[])
{
tfoo<Dummy>();
}
С этим кодом:
foo
не зависит от T
. Это может показаться глупым в плане различий, но если вы подумаете о количестве include в большой программе, есть риск, что кто-то введет перегрузку после кода вашего шаблона... и BAM :/
Я не уверен, что «расширение» - это именно то, как я бы описал VC ++ в этом отношении, но да, gcc в этом отношении лучше соответствует.