能否请您说明为什么我在以下代码中遇到错误?
error: cannot define member function ‘Test<int>::Printer::Print’ within ‘Test<int>’
我正在使用gcc
版的8.1.1
,并将代码编译为g++ -std=c++11
。
尽管,如果我将函数Print
的定义移到struct Printer
的定义下(即,使其隐式内联),则编译器不会产生任何错误。
#include <iostream>
template <typename Type>
struct TestBase {
struct Printer {
template <typename T>
void Print(const T& t) {
std::cout << t << std::endl;
}
};
};
template <typename Type>
struct Test;
template<>
struct Test<int> : public TestBase<int> {
struct Printer : public TestBase<int>::Printer {
template <typename T>
void Print(int i, const T& t);
};
template <typename T>
void Printer::Print(int i, const T& t) {
std::cout << i << t << std::endl;
}
};
int main() {
Test<int> t;
}
更新:
Brian指出了这种情况的确切原因:“ ...出现在类定义之外的成员函数定义应出现在包含类定义的名称空间范围中……”
Brian不仅回答了开始这个话题的主要问题,而且还回答了我在他被接受的回答中的补充评论。
答案 0 :(得分:3)
[class.mfct] / 1,重点是我的
...出现在类定义之外的成员函数定义应出现在包含类定义的名称空间范围内。 ...
因此,封闭的 class 范围不是该定义的允许位置。