g ++和clang ++在嵌套类中的不同行为

问题描述 投票:0回答:1

我注意到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() {

现在它的建议似乎很奇怪。

问题
  1. 为什么两个编译器的行为不同?

  • 使用正确的语法是什么?
  • 我注意到gcc 9.2.0和clang ++ 9.0.1之间有不同的行为。我的代码如下//header.hh ... template class Outer {... public:template

    c++ gcc c++17 clang++
    1个回答
    1
    投票

    正确的语法如下:

    template <typename T>
    template <typename S>
    typename Outer<T>::template Inner<S> &Outer<T>::Inner<S>::func() {
        ...
    }
    
    © www.soinside.com 2019 - 2024. All rights reserved.