Определение шаблонной функции-члена вне класса не удается собрать 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()
{
}
};