曾经在旧版gcc中使用的C ++模板在clang ++中导致“阴影模板参数”错误

w

我使用gcc 3.x编写了大约08年的代码。我现在正在尝试使用clang 3.4进行编译,但出现了我不理解的模板错误。这个想法是声明任意维数和精度的固定维数vec类型,然后基于这些定义vecPair类型。我不了解“ a.convert()”内部的模板类型名称S的用法如何遮盖了模板参数;它意味着使用参数,而不是重新声明它。任何信息将不胜感激!

typedef unsigned int Uns;

template <typename T>
inline const T& min(const T& a, const T& b) {
  return a <= b ? a : b;
}

template <Uns N, typename T>
struct vec {

  T comp[N];

  template <Uns M, typename S>
  inline vec<M, S> convert() const {
    vec<M, S> converted;
    for (Uns i = 0; i < min(M, N); ++i) converted[i] = comp[i];
    for (Uns i = N; i < M; ++i) converted[i] = 0;
    return converted;
  }
};

template <Uns N, typename T>
struct vecPair {

  vec<N, T> a;
  vec<N, T> b;

  inline vecPair(const vec<N, T>& _a, const vec<N, T>& _b) : a(_a), b(_b) {}

  template <Uns M, typename S>
  inline vecPair<M, S> convert() const {
    vec<M, S> ca = a.convert<M, S>();
    vec<M, S> cb = b.convert<M, S>();
    return vecPair<M, S>(ca, cb);
  }
};

clang 3.4提供以下输出:

$ clang++ -fsyntax-only vec-bug.cpp 
vec-bug.cpp:30:33: error: declaration of 'S' shadows template parameter
    vec<M, S> ca = a.convert<M, S>();
                                ^
vec-bug.cpp:28:29: note: template parameter is declared here
  template <Uns M, typename S>
                            ^
vec-bug.cpp:30:34: error: expected ';' at end of declaration
    vec<M, S> ca = a.convert<M, S>();
                                 ^
                                 ;
vec-bug.cpp:31:12: error: template argument for template type parameter must be a type
    vec<M, S> cb = b.convert<M, S>();
           ^
vec-bug.cpp:11:27: note: template parameter is declared here
template <Uns N, typename T>
                          ^
...
克瑞克SB

这似乎可行:

vec<M, S> ca = a.template convert<M, S>();
vec<M, S> cb = b.template convert<M, S>();

我认为a并且b具有依赖类型,因此您需要消除歧义,这convert是一个模板。我不确定为什么GCC不介意。

更新:这似乎是一个已知的GCC错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

曾经在旧版gcc中使用的C ++模板在clang ++中导致“阴影模板参数”错误

来自分类Dev

模板参数阴影的C ++声明模板参数错误

来自分类Dev

Clang和GCC误导模板参数

来自分类Dev

c的模板阴影错误

来自分类Dev

模板参数类型成员上的运算符<<仅在clang中导致错误

来自分类Dev

GCC 5 的模板参数阴影

来自分类Dev

C ++:以模板对象为参数的模板。导致链接错误

来自分类Dev

C ++模板和阴影参数

来自分类Dev

C ++ 11:模板参数中的SFINAE,GCC与Clang

来自分类Dev

模板模板参数和clang

来自分类Dev

使用GCC而不是clang进行模板友谊错误编译

来自分类Dev

功能模板作为成员-GCC与CLANG

来自分类Dev

gcc失败,模板递归,而clang不

来自分类Dev

gcc失败,模板递归,而clang不

来自分类Dev

由于删除了模板化的左值转换运算符,可能导致clang或gcc错误?

来自分类Dev

gcc可以编译可变参数模板,而clang不能

来自分类Dev

可变参数模板模板参数和GCC,Clang和MSVC中的sizeof差异-谁是正确的?

来自分类Dev

clang不使用可变参数推断可变参数模板函数中的模板参数

来自分类Dev

使用变量模板的递归计算-gcc vs clang

来自分类Dev

使用lambdas的可变参数模板:g ++错误,但与clang ++一起运行

来自分类Dev

对于曾经在gcc5中工作的情况,无法在gcc6的部分专业化中推导模板参数

来自分类Dev

使用clang的显式C ++模板实例化

来自分类Dev

没有关于gcc但带有Clang的模板函数中未使用参数的警告

来自分类Dev

没有关于gcc但带有Clang的模板函数中未使用参数的警告

来自分类Dev

模板专业化和DLL:Visual Studio与(GCC / Clang)

来自分类Dev

GCC和Clang模板调用分辨率差异

来自分类Dev

gcc 和 clang 是否不能正确推断模板别名类型?

来自分类Dev

g ++和clang具有递归可变参数模板位集创建的不同行为(可能是gcc错误?)

来自分类Dev

__attribute __((vector_size(N)))的clang模板化使用

Related 相关文章

  1. 1

    曾经在旧版gcc中使用的C ++模板在clang ++中导致“阴影模板参数”错误

  2. 2

    模板参数阴影的C ++声明模板参数错误

  3. 3

    Clang和GCC误导模板参数

  4. 4

    c的模板阴影错误

  5. 5

    模板参数类型成员上的运算符<<仅在clang中导致错误

  6. 6

    GCC 5 的模板参数阴影

  7. 7

    C ++:以模板对象为参数的模板。导致链接错误

  8. 8

    C ++模板和阴影参数

  9. 9

    C ++ 11:模板参数中的SFINAE,GCC与Clang

  10. 10

    模板模板参数和clang

  11. 11

    使用GCC而不是clang进行模板友谊错误编译

  12. 12

    功能模板作为成员-GCC与CLANG

  13. 13

    gcc失败,模板递归,而clang不

  14. 14

    gcc失败,模板递归,而clang不

  15. 15

    由于删除了模板化的左值转换运算符,可能导致clang或gcc错误?

  16. 16

    gcc可以编译可变参数模板,而clang不能

  17. 17

    可变参数模板模板参数和GCC,Clang和MSVC中的sizeof差异-谁是正确的?

  18. 18

    clang不使用可变参数推断可变参数模板函数中的模板参数

  19. 19

    使用变量模板的递归计算-gcc vs clang

  20. 20

    使用lambdas的可变参数模板:g ++错误,但与clang ++一起运行

  21. 21

    对于曾经在gcc5中工作的情况,无法在gcc6的部分专业化中推导模板参数

  22. 22

    使用clang的显式C ++模板实例化

  23. 23

    没有关于gcc但带有Clang的模板函数中未使用参数的警告

  24. 24

    没有关于gcc但带有Clang的模板函数中未使用参数的警告

  25. 25

    模板专业化和DLL:Visual Studio与(GCC / Clang)

  26. 26

    GCC和Clang模板调用分辨率差异

  27. 27

    gcc 和 clang 是否不能正确推断模板别名类型?

  28. 28

    g ++和clang具有递归可变参数模板位集创建的不同行为(可能是gcc错误?)

  29. 29

    __attribute __((vector_size(N)))的clang模板化使用

热门标签

归档