Я столкнулся с ошибкой компилятора в Visual Studio 2010, которую я сократил до следующего кода:
template <int i> struct A
{
typedef int T;
};
template<int i>
struct B
{
static const int i = i; // <-- this seems to cause the problem
typename A<i>::T F();
};
template<int i>
typename A<i>::T B<i>::F() { return B<i>::i; }
Этот код выдает эту ошибку:
repro.cpp(15): error C2244: 'B<i>::F' : unable to match function definition to an existing declaration
repro.cpp(12) : see declaration of 'B<i>::F'
definition
'A<i>::T B<i>::F(void)'
existing declarations
'A<i>::T B<i>::F(void)'
Если объявление для i
в структуре B
удалено, ошибка компилятора исчезнет. Я полагаю, это потому, что параметр шаблона для возвращаемого типа F
привязан к статическому члену i
внутри B
вместо аргумента шаблона B
. Почему возвращаемые типы для F
отличаются, когда значение для i
одинаково? Это ошибка?
Я должен также упомянуть, что если функция объявлена как inline, ошибка исчезнет.