【问题标题】:Define a function outside a class template for pointers在类模板之外为指针定义一个函数
【发布时间】:2015-03-08 05:46:23
【问题描述】:

我想为指针模板参数和其他参数类型定义一个成员函数。我尝试了以下代码:

#include <iostream>

template <class T, class W>
struct A
{
    void foo();
};

template<class T, class W> void A<T*, W*>::foo(){ std::cout << "foo" << std::endl; }
int main(){  }

DEMO

目前尚不清楚为什么它不起作用。我将指针模板参数按照它们在模板声明中指定的顺序放置。其实N4296::14.5.1/3 [temp.class]

类模板名称后面的模板参数列表 成员定义应以与参数相同的顺序命名参数 在成员的模板参数列表中使用。

那么为什么代码不起作用?我把参数按相同的顺序排列。

【问题讨论】:

  • 改用... void A&lt;T, W&gt;::foo() { ...,即去掉星号。
  • @JoachimPileborg 去掉星号可以为任何TW 定义foo,而不仅仅是指针。
  • 啊,所以你想要函数的专业化?但是,您不能只专门化单个成员函数,您必须专门化整个结构。
  • @JoachimPileborg 好的,我明白了。现在我想以正式的方式理解为什么它如此正式。没有参考资料吗?
  • @JoachimPileborg BTW,为什么下面的代码可以正常工作link

标签: c++ templates pointers


【解决方案1】:

你必须将整个结构体定义为部分特化,你不能只挑选个别成员来特化

[temp.class.spec]

1 [...] 部分特化应在第一次使用类模板特化之前声明,该类模板特化将使用部分特化作为每个翻译单元中隐式或显式实例化的结果发生;不需要诊断。

#include <iostream>

template <class T, class W>
struct A
{
  void foo();
};

template<class T, class W>
struct A<T*, W*>
{
  void foo();
};

template<class T, class W> void A<T*, W*>::foo() { std::cout << "foo" << std::endl; }

int main() {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2020-08-09
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多