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

Ibr*_*ish 1 c++ templates friend

我有以下 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;
}
Run Code Online (Sandbox Code Playgroud)

编译使用:

g++ -std=c++17 -O2 -Wall -迂腐的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; }*
Run Code Online (Sandbox Code Playgroud)

经历了这里发布的其他类似错误,但无法得到解决它的想法。


在遵循您的所有答案之后,通过使用您的所有建议修复代码,现在只有一个错误。

#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; }
Run Code Online (Sandbox Code Playgroud)

错误是:

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; }
Run Code Online (Sandbox Code Playgroud)

Waq*_*med 5

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

外:

template<typename T> struct Base {
...
Run Code Online (Sandbox Code Playgroud)

内:

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

更改其中之一即可解决此问题。

内部固定:

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

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

template<typename T, std::size_t N> inline A<T,N>::A() { n = N; }
Run Code Online (Sandbox Code Playgroud)

n如果未定义,则未声明,因此您可能还NDEBUG需要将其包装起来。#ifdef

  • 或者甚至没有声明名称:`template&lt;typename, std::size_t&gt;friend struct A;`。 (2认同)