相关疑难解决方法(0)

为什么模板只能在头文件中实现?

引自C++标准库:教程和手册:

目前使用模板的唯一可移植方法是使用内联函数在头文件中实现它们.

为什么是这样?

(澄清:头文件不是唯一的便携式解决方案.但它们是最方便的便携式解决方案.)

c++ templates c++-faq

1660
推荐指数
14
解决办法
46万
查看次数

如何为模板类中定义的类定义朋友

假设我有以下模板类来定义嵌套类:

template <typename T>
struct foo {
    struct bar { };
};
Run Code Online (Sandbox Code Playgroud)

假设我编写的环境也有以下帮助器类,它应该专门用于需要特殊处理的任何类型:

template <typename T>
struct maybeChangeType { using type = T; }  /* default: same type */
Run Code Online (Sandbox Code Playgroud)

我怎么能专门maybeChangeTypefoo<T>::bar?比如说,它很容易专门用于,foo<int>::barfoo将会使用100多个不同的,T所以这不是一个真正的选择.

注意:在将此问题标记为重复之前,请仔细阅读.这个问题并不是要问如何专注于一般(例如,在c ++中理解模板),或如何声明朋友,甚至如何声明模板的朋友.它询问如何为模板类的非模板嵌套成员声明朋友(如标题所述).

尝试以"正常"方式定义专业化不起作用,因为foo<T>::bar它不是可推导的上下文(坏符号:它需要typename在前面):

/* error: template parameters not deducible in partial specialization */
template <typename T>
struct maybeChangeType<typename foo<T>::bar>;
Run Code Online (Sandbox Code Playgroud)

将专业化声明为朋友也会产生编译错误:

template <typename T>
struct foo {
    struct bar {
        /* errors:
         * …
Run Code Online (Sandbox Code Playgroud)

c++ templates friend inner-classes template-specialization

8
推荐指数
1
解决办法
508
查看次数