我有以下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
中。