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
中。
我有以下正在编译的 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
中。