由于继承,模板函数的多个函数定义

Multiple function definition for templated function due to inheritance

由于函数使用模板化参数和继承,我无法使用 VS2015 编译我的程序。

错误是this one

我正在努力实现以下目标:

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);

怎么是多定义?

编辑 - 完整的错误信息: Error C2995 'void function(Foo<T> &)': function template has already been defined

EDIT² - 从零开始

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 已经为 class 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;
};