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



我有以下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; }

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

最新更新