我注意到gcc
9.2.0和clang++
9.0.1之间有不同的行为。我的代码如下
//header.hh
...
template <typename T>
class Outer {
...
public:
template <typename S>
class Inner;
...
};
template <typename T>
template <typename S>
class Inner {
...
Inner& func();
...
};
然后,由于功能func()
在另一个文件中实现
//implementation.cc
template <typename T>
template <typename S>
Outer<T>::Inner<S>& Outer<T>::Inner<S>::func() {
...
};
现在,如果我使用g++
,则编译正常。如果使用clang++
,我得到
src/implementation.cc:6:1: error: missing 'typename' prior to dependent type template name 'Outer<T>::Inner'
Outer<T>::Inner<S>& Outer<T>::Inner<S>::func() {
^
1 error generated.
但是,如果我遵循其建议和使用,则>]
typename Outer<T>::Inner<S>& Outer<T>::Inner<S>::func()
我遇到另一个错误:
src/implementation.cc:6:21: error: use 'template' keyword to treat 'Inner' as a dependent template name typename Outer<T>::Inner<S>& Outer<T> ::Inner<S>::func() {
现在它的建议似乎很奇怪。
我注意到gcc 9.2.0和clang ++ 9.0.1之间有不同的行为。我的代码如下//header.hh ... template
正确的语法如下:
template <typename T>
template <typename S>
typename Outer<T>::template Inner<S> &Outer<T>::Inner<S>::func() {
...
}