2016-06-16 2 views
2

Я хочу создать структуру времени компиляции, которая отображает сообщения для процессоров по умолчанию, но мой код не скомпилируется в msvs 2015 update2. Я думаю, что это ошибка в компиляторе, поскольку код довольно легальный и компилируется с помощью gcc. Ниже вы можете увидеть минимальный пример воспроизведения проблемыОшибка создания шаблона в msvs 2015

#include <tuple> 

struct About; 

struct PluginStub 
{ 
    static void About(); 
}; 

template<typename Sink> 
class Processor 
{ 
    template<typename Call, typename Stub, Stub Pointer> 
    struct Method; 

    using Methods = std::tuple<Method<About, decltype(&PluginStub::About), &PluginStub::About>>; 
}; 

Это дает такой результат:

1> main.cpp(25): error C2440: 'specialization': cannot convert from 'void (__cdecl *)(void)' to 'unknown-type' 
1> main.cpp(25): note: Context does not allow for disambiguation of overloaded function 
1> main.cpp(26): note: see reference to class template instantiation 'Processor<Sink>' being compiled 

Вопросы:

  • Правильно ли я об ошибке в МСВС?
  • Как решить эту проблему?
+0

@Cody Грей. В том же шаблоне – sliser

ответ

2

Обходной будет использовать std::decay:

using Methods = std::tuple<Method<About, 
          typename std::decay<decltype(&PluginStub::About)>::type, 
          &PluginStub::About>>; 
+0

Не могли бы вы объяснить, почему это помогает? – sliser

+1

@sliser sure, в качестве второго аргумента вам нужен тип указателя на функцию. Скорее всего, в 'decltype' vC++ есть привязанные строки, здесь находится' std :: decay'. – 101010

0
  1. Действительно, это ошибка. Я создал билет https://connect.microsoft.com/VisualStudio/feedback/details/2822978/template-instantiation-error-in-msvs-2015
  2. Другой способ обхода этой ошибки заключается в перемещении Определение методов вне класса Область процессора.

P.S Все компилируется нормально, если процессор не шаблонный класс

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