簡體   English   中英

Visual Studio 錯誤或 c++ 標准已更改?

[英]visual studio bug or c++ standard changed?

#include <iostream>

template<typename T>
struct base {
    void hello() {
    }
};

template<typename T>
struct ttt : public base<ttt<T>> {
public:
    ttt() {
        hello();
    }
};

int main() {
    ttt<int> t();
    return 0;
}

當我使用 c++ 17 或 11 時,此代碼就可以了。 但是當我將 c++ 標准設置為 20 時,發生的 C3816 錯誤說找不到你好 function,我對原因感到困惑,為什么這個錯誤直到 Z6CE809EACF90BA125B40FA4BD903962E

hello(); 語句不依賴於模板參數,並且在直接搜索上下文中沒有這樣的名稱(即在ttt或其非模板基 class 內部,如果有的話),因此名稱查找將在非模板上下文中完成。 即,如果您有一個名為hello的全局 function ,則會選擇它。 這是由每個標准規定的,至少從 C++11 開始。 一種符合標准的方法是使prvalue依賴於模板的參數:

     this->hello();  // this is dependant on T

另一種方法是使用帶有base<ttt<T>>::前綴的完全限定名稱,但這意味着只能選擇該版本的 function。 如果ttt將覆蓋它,如果 inheritance 樹將展開並且將有另一個重載\覆蓋hello ,如果多個虛擬 inheritance 將存在,則此類限定名稱可能指向意外的 ZC1C425268E68384F1AB57A 成員

Visual Studio 中的錯誤至少可以追溯到 VS2010,我個人多年來一直深受其害,因為開發人員會編寫使用 MSVC 編譯的代碼,但 gcc 不會編譯,我每次都必須向他們解釋出了什么問題( “但它可以編譯。”)。

這是默認設置的更改。

從 Visual Studio 2019 版本 16.8 開始,/std:c++latest 選項隱式設置 /permissive- 選項。

https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-160

要使用基本 class 名稱修復代碼前綴 function 名稱:

base<ttt<T>>::hello();

在我的 class 的頂部,我想添加:

using Base = base<ttt<T>>;

然后我可以打電話:

Base::hello();

暫無
暫無

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

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