Определение нескольких функций для шаблонной функции из-за наследования - PullRequest
0 голосов
/ 17 января 2019

Я не могу скомпилировать свою программу с VS2015 из-за функции, использующей шаблонный параметр и наследование.

Ошибка эта .

Я пытаюсь добиться следующего:

class A
{
    //do something
};

class B : public A
{
    //do something
};

template <typename T>
class Foo {
    template <typename T>
    friend void function(Foo<T> & sm) {
        //do something
    }
};

void main()
{
    Foo<A> test;
    Foo<B> test2;
};

Я понимаю значение ошибки, но не понимаю, почему это происходит на самом деле.

Полагаю, function создается с двумя разными сигнатурами:

void function(Foo<A> & sm); и void function(Foo<B> & sm);

Какое это мультиопределение?

EDIT - полное сообщение об ошибке: Error C2995 'void function(Foo<T> &)': function template has already been defined

EDIT² - С нуля enter image description here

1 Ответ

0 голосов
/ 17 января 2019

И у Clang, и у MS одна и та же жалоба. Удалите второй спецификатор шаблона, и он скомпилируется.

class A{};
class B : public A{};

template <typename T>
class Foo {

//  template <typename T>
    friend void function(Foo<T> & sm) {
    }
};

int main()
{
    Foo<A> test;
    Foo<B> test2;
};

T уже задано для класса Foo, так что функция его друга описана. Вы бы использовали нам секунду template, если бы была разница в функции, например:

class A{};
class B : public A{};

template <typename T>
class Foo {

    template <typename U>
    friend void function(Foo<T> & sm, U another) {
    }
};

int main()
{
    Foo<A> test;
    Foo<B> test2;
};
...