Определение шаблонной функции-члена вне класса не удается собрать Visual Studio 2013

Я вставил ниже минимума сложного фрагмента кода шаблона, с которым я имею дело.

 1  template <typename T>
 2  class Base
 3      : public T
 4  {
 5  public:
 6      template <typename W, W& (T::ToImpl::*Func)()>
 7      bool Foo();
 8  };
 9  
10  template <typename T>
11  template <typename W, W& (T::ToImpl::*Func)()>
12  bool Base<T>::Foo()
13  {}
14  
15  int
16  main()
17  {
18      return 0;
19  }

Код довольно прост, поэтому я не буду ничего объяснять. Я не могу скомпилировать этот код с Visual Studio 2013 (он же VC++12). Это дает следующую ошибку:

main.cc(13): error C2244: 'Base<T>::Foo' : unable to match function definition to an existing declaration
          definition
          'bool Base<T>::Foo(W)'
          existing declarations
          'bool Base<T>::Foo(W)'

Из любопытства я попытался скомпилировать приведенный выше код с помощью g++ (4.4.7), и он скомпилировался нормально.

Я был бы признателен, если кто-то может предложить объяснение того, почему код не компилируется в Windows? Исправление будет еще слаще.:)

1 ответ

Это должно работать:

template <typename T>
struct to_impl
{
    typedef typename T::ToImpl type;
};

template <typename T>
class Base
    : public T
{
public:
    template <typename W, W& (to_impl<T>::type::*Func)()>
    bool Foo();
};

template <typename T>
template <typename W, W& (to_impl<T>::type::*Func)()>
bool Base<T>::Foo()
{
}

Хотя было бы проще реализовать Foo в Base:

template <typename T>
class Base
    : public T
{
public:
    template <typename W, W& (T::ToImpl::*Func)()>
    bool Foo()
    {
    }
};
Другие вопросы по тегам