Ошибка компилятора шаблона VC ++ C2244: невозможно сопоставить определение функции с существующим объявлением - PullRequest
1 голос
/ 25 июня 2011

Я столкнулся с ошибкой компилятора в 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, ошибка исчезнет.

1 Ответ

1 голос
/ 25 июня 2011

Проблема в том, что вы объявляете одно и то же имя дважды в одной и той же области видимости.Если вы переименуете static const int i или параметр шаблона, он должен работать.

...