簡體   English   中英

嵌套類中 g++ 和 clang++ 之間的不同行為

[英]Different behavior between g++ and clang++ in nested classes

我注意到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. 為什么這兩個編譯器的行為不同?
  2. 要使用的正確語法是什么?

正確的語法如下:

template <typename T>
template <typename S>
typename Outer<T>::template Inner<S> &Outer<T>::Inner<S>::func() {
    ...
}

您可以在問題中找到此語法的完整解釋。

但是,更簡單且有效的語法是這樣的:

template <typename T>
template <typename S>
auto Outer<T>::Inner<S>::func() -> Inner& {
    ...
}

通過在上面的示例中使用尾隨返回類型語法,您可以利用名稱解析范圍在Outer<T>::Inner<S>內這一事實,因此您可以使用Inner注入類名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM