由于继承而导致模板化功能的多功能定义

时间:2019-01-17 15:03:19

标签: c++ inheritance friend

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

错误是this one

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

TableHeader

我确实理解该错误的含义,但我不理解为什么它实际上会发生。

我想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; }; 是用两个不同的签名创建的:

functionvoid function(Foo<A> & sm);

这是多定义的吗?

编辑-完整的错误消息: void function(Foo<B> & sm);

EDIT²-从头开始 enter image description here

1 个答案:

答案 0 :(得分:2)

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