![](/img/trans.png)
[英]Why do I have warning C4199 two-phase name lookup is not supported for c++/cli, c++/cx, or openmp; use /Zc:twoPhase-
[英]Why does the /Zc:twoPhase- compiler switch has no effect in MSVC?
為什么沒有/Zc:twoPhase-
后面的編譯器開關/permissive-
開關導致編譯錯誤在MSVC 19.13消失,就像他們消失時/許可,`開關被完全去除,用下面的問題代碼?
#include <stdio.h>
template <unsigned int BYTES>
class CBase
{
public:
char Arr[BYTES];
int Fn1(void) {
return Arr[1] ^ Arr[sizeof(Arr)-1];
}
int Fn2(void) {
return Arr[2] ^ Arr[sizeof(Arr)-2];
}
};
template <unsigned int BYTES>
class CDerived : public CBase<BYTES>
{
public:
int FnSum(void) {
return Fn1() + Fn2() + Arr[0]; // ERRORs: identifiers "Fn1" and "Fn2" and "Arr" are NOT found !
}
};
int main(void)
{
CDerived<32> ddd;
printf("%d\n", ddd.Fn1()); //No error here
printf("%d\n", ddd.Fn2()); //No error here
printf("%d\n", ddd.FnSum());
return (int)ddd.Arr[0]; //No error here
}
完全刪除/permissive-
開關后,以上代碼將在MSVC v19.10中編譯。
請參閱: https : //godbolt.org/g/Yxw89Y
注意:由於最新的Godbolt MSVC編譯器(v19.10)已過時且不支持/Zc:twoPhase-
,因此我無法在http://godbolt.org /permissive- /Zc:twoPhase-
開關一起包含到示例的鏈接。 /Zc:twoPhase-
編譯器開關。
根據本文和本文 ,MSVC中的編譯錯誤來自通過遵循C ++標准模式(由/permissive-
選項啟用)啟用的兩階段名稱查找。
同樣,根據前一篇文章 :“ /permissive-
選項隱式設置符合條件的兩階段查找編譯器行為,但是可以使用/Zc:twoPhase-
switch覆蓋它 ”。
但是,添加兩個編譯器開關/permissive- /Zc:twoPhase-
( /permissive- /Zc:twoPhase-
順序)不會覆蓋它,並且不會使編譯錯誤在MSVC v19.13中消失。
有關此問題的上下文,請參閱此條目 。
使用/permissive-
,此代碼確實以VS 2017(15.7更新)版本19.14構建,因此,這可能只是VS 2017(15.6更新)中的編譯器錯誤已修復。 您的原始代碼與兩階段查找沒有任何關系。
如果代碼使用
/permissive-
出錯,然后使用/permissive- /Zc:twoPhase-
進行構建,則它與兩階段相關。 否則,這僅僅是由於/permissive-
switch強制執行了一致性。 請參見使Visual C ++轉換為標准符合性,並且MSVC提供了兩階段名稱查找支持 。
更新它使用x86而不是x64進行構建,這似乎強化了以下觀念:這是編譯器錯誤,而不是源代碼一致性問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.