c++ - 模板意大利面

标签 c++ templates metaprogramming

请解释一下那 block 令人费解的模板意大利面:

template <typename T, typename K> class A {
public:
    T t;
    K k;

    template <int i, int unused = 0> struct AttributeType {
    };

    template <int i> AttributeType<i> getAttr();

};

template <typename T, typename K> template <int i> A<T, K>::AttributeType<i> A<T, K>::getAttr<i>() {
    return t;
}

我无法想出正确的语法来定义 A::getAttr() 的实现.当前代码无法在 getAttr 定义行编译:

error: function template partial specialization ‘getAttr<i>’ is not allowed

我应该如何改写函数定义?

最佳答案

删除<i>在函数名后面加上一个typename在返回类型之前,它是一个相关名称。此外,它缺少一个 template之前 AttributeType因为那是一个模板:

template <typename T, typename K>
template <int i>
typename A<T, K>::template AttributeType<i> A<T, K>::getAttr() {
    return t;
}

接下来,给每个模板部分单独一行会很有帮助。使内容更清晰。

除此之外,该函数看起来不对,或者 AttributeType有一个来自 T 的转换构造函数?

关于c++ - 模板意大利面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6232085/

相关文章:

c++ - 从基指针向下转换为模板派生类型

c++ - 通过 Qt 播放 mov 文件

c++ - || 的逻辑错误运算符(operator)?

c++ - Make - "Treat warning as error"对于特定文件

c++ - 在每个源文件中替代 "extern template"

c++ - 带有 constexpr 的编译时数组

c++ - Visual Studio 和 Visual C++ 一样吗

templates - Bigcommerce:%%SNIPPET_SideCategoryList%% - 底层模板文件在哪里?

c++ - 数据成员 'queryCallback' 不能是成员模板

C++ pimpl idiom : Implementation depending on a template parameter 收藏