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

C++ declaration of template parameter shadows template parameter error

我有以下正在编译的 C++ 代码:

#include <cstddef>
#include <cassert>
template<typename T, std::size_t N> struct A;
template<typename T> struct Base {
    T &operator [](std::size_t i);
private:
    template<typename T, std::size_t N> friend struct A;
    #if !defined(NDEBUG)
        size_t n;
    #endif
};
template<typename T, std::size_t N> struct A : public Base<T> {
    A();
private:
    friend class Base<T>;
    T a[N];
};
template<typename T, std::size_t N> inline A<T,N>::A() { n = N; }
template<typename T> inline T& Base<T>::operator [](std::size_t i) {
    assert(i < n);
    return ((A<T,1>*)this)->a[i];
}
int main() {
    A<int, 3> a3;
    a3[1] = 1;
}

编译使用:

g++ -std=c++17 -O2 -Wall -pedantic main.cpp && ./a.out

并给出以下 3 个编译器错误:

*main.cpp:7:14: error: declaration of template parameter 'T' shadows template parameter
    7 |     template<typename T, std::size_t N> friend struct A;

main.cpp:4:10: note: template parameter 'T' declared here
    4 | template<typename T> struct Base {

main.cpp: In constructor 'A<T, N>::A()':
main.cpp:18:58: error: 'n' was not declared in this scope
   18 | template<typename T, std::size_t N> inline A<T,N>::A() { n = N; }*

查看了此处发布的其他类似错误,但无法解决问题。


按照您的所有回答进行操作后,现在通过使用您的所有建议修复代码,现在只有一个错误。

#include <cstddef>
using namespace std;
template <typename, std::size_t N> struct A;
template <typename T> struct Base { // template inheritance, compiler errors
    T& operator [](std::size_t i);
private:
    template<typename, std::size_t N> friend struct A;
    size_t n;
};
template <typename T, std::size_t N> struct A : public Base<T> {
    A();
private:
    friend class Base<T>;
    T a[N];
};
template <typename T, std::size_t N> inline A<T,N>::A() { n = N; }
template <typename T> inline T& Base<T>::operator[](std::size_t i) {
    return ((A<T,1>*)this)->a[i];
}
int main() { A<int, 3> a; a[1] = 1; }

错误是:

main.cpp: In constructor 'A< <template-parameter-1-1>, N>::A()':
main.cpp:17:59: error: 'n' was not declared in this scope
17 | template <typename T, std::size_t N> inline A<T,N>::A() { n = N; }

您在外部和内部模板中使用了相同的名称,即 typename T

外部:

template<typename T> struct Base {
...

内部:

    template<typename T, std::size_t N> friend struct A;
    #if !defined(NDEBUG)

更改其中一个以解决此问题。

内部固定:

    template<typename U, std::size_t N> friend struct A;
    #if !defined(NDEBUG)

此外,这里还有一个错误:

template<typename T, std::size_t N> inline A<T,N>::A() { n = N; }
如果未定义

n,则未声明 [​​=16=],因此您可能还需要将其包装在 #ifdef 中。