2016-10-07 2 views
1

header.hЯвный экземпляр шаблона с использованием псевдонима?

template <int> 
class FiniteElement 
{ 
public: 
    int GetDOF(); 
}; 

using FiniteElement2D= FiniteElement<3>; 
using FiniteElement3D= FiniteElement<6>; 

Source.cpp

#include "Header.h" 

//template class FiniteElement<3>; 
//template class FiniteElement<6>; 
template FiniteElement2D; // Using alias for explicit template instantiation !!! 
template FiniteElement3D; 

template <int DOF> 
int FiniteElement<DOF>::GetDOF() 
    { return DOF; } 

main.cpp

#include "Header.h" 
#include <iostream> 

int main() 
{ 
FiniteElement3D Elem; 

std::cout << Elem.GetDOF(); 

return 0; 
} 

К моему удивлению, выше программа компилируется и ссылки с видео Обновление Studio 2015 3. Мне нравится идея разрешить псевдоним использоваться для явного создания экземпляра шаблона, но, похоже, он не работает с gcc или clang.

Является ли это признаком предстоящего стандарта или чего-то конкретного ВС?

+0

Это не связано с текущим Clang/C2 (июль 2016 года), но по-прежнему связано с сегодняшней ежедневной сборкой (v19.10.24606). Пожалуйста, [укажите отчет об ошибке] (https://connect.microsoft.com/VisualStudio/) и разместите здесь ссылку. – ildjarn

+1

@GuillaumeRacicot В ретроспективе легко назвать «глупым» то, что сейчас ясно, было плохим дизайнерским решением. https://blogs.msdn.microsoft.com/vcblog/2015/09/25/rejuvenating-the-microsoft-cc-compiler/ Да, VS еще не соответствует требованиям, да, все другие основные компиляторы полностью соответствуют C + +14. Но вы должны отдать должное им за то, что они владеют и идут (медленно) в правильном направлении: https://blogs.msdn.microsoft.com/vcblog/2016/06/07/expression-sfinae-improvements-in-vs- 2015-update-3 /. Они (и мы как пользователи) платят за ошибку, сделанную давно - **, которая выглядела прямо в это время **. – bolov

+0

@bolov да, вы правы. Я думаю, что на сегодня у меня есть ошибка VS ... –

ответ

1

Ответ был дан в комментариях, но слегка замаскирован, поэтому я буду расширять его здесь.

Способ работы MSVC-компилятора в этом случае почти аналогичен выполнению текстовой замены в программном коде. Он в основном заменяет весь текст FiniteElement2DFiniteElement<3> - таким образом, явное создание экземпляра отлично подходит для вас.

Другие компиляторы, с другой стороны, создают правильное абстрактное синтаксическое дерево для typedef, и, как следствие, использование псевдонима не распространяется на явное создание экземпляра шаблона.

Как примечание, я не уверен, какую выгоду вы ожидаете получить от своего синтаксиса.

Смежные вопросы