Ниже приводится фрагмент тестового кода, и я сравниваю результат его компиляции с MSVC и Clang соответственно. Вывод каждого компилятора показан ниже. MSVC делает вид, что неиспользованного объявления шаблона даже не существует. Clang выдает ошибку. Вопрос в том, какой компилятор здесь наиболее соответствует стандарту?
Я видел унаследованный производственный код, который полагается на поведение MSVC, и я не уверен, можно ли и дальше полагаться на него.
class S
{
struct P {};
};
template<typename T>
S::P Bat(T);
Компилируется чисто в MSVC10:
E:\clangbuild\bin\Release>cl /c /nologo test.cpp
test.cpp
Выдает ошибку в Clang:
E:\clangbuild\bin\Release>clang++ test.cpp
test.cpp:9:4: error: 'P' is a private member of 'S'
S::P Bat(T);
^
test.cpp:5:9: note: implicitly declared private here
struct P {};
^
1 error generated.