![](/img/trans.png)
[英]can I use SFINAE to selectively define a member variable in a template class?
[英]Can I use `distance` as my class member variable name?
可以像這樣定義 class (忽略它的實現):
class MyEngine {
private:
int* params;
int param_len;
public:
void set_params(int* _params, int _len);
float get_result(); // relies on `distance` member
float distance; // people can modify this
};
但是,如果使用vector
,假設它隱式包含<iterator>
其中包含std::distance
,編譯器如何區分std::distance
和distance
成員? (或者運行時會導致意外崩潰?) 。 比如說,function get_result()
依賴於distance
成員值。
#include <vector>
using namespace std;
class MyEngine {
private:
vector<int> params;
public:
void set_params(int* _params, int _len);
float get_result(); // relies on `distance` member
float distance; // people can modify this
};
更新
正如人們所提到的, using namespace std
是不好的做法; 但是,仍然有人using namespace std
編寫代碼,如果我們與他們合作,使用他們的代碼,是否有任何實例可以證明using namespace std
的壞處,特別是嚴重的運行錯誤? 這,才是我真正的目的。
有一個答案,說按類型區分兩者的distance
。 讓我們試試這個片段:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iterator>
using namespace std;
class MyEngine {
private:
vector<int> params;
float* distance; // people can modify this
int len;
public:
void setup();
};
void MyEngine::setup()
{
len = 100;
distance = (float*)malloc(sizeof(float)*len);
for(int i=0; i<len; i++) {
distance[0] = len - i;
params.push_back(len-i);
}
int num = distance(params.begin(), params.end());
printf("distance is: %d\n", num);
}
int main(){
MyEngine engine;
int len = 10;
engine.setup();
return 0;
}
這會導致編譯錯誤說:
main.cpp:25:23: error: called object type 'float *' is not a function or function pointer
int num = distance(params.begin(), params.end());
~~~~~~~~^
1 error generated.
表明它無法從它們的類型上區分這兩個distance
。
function distance
的類型與成員distance
不同,因此編譯器通過類型計算出來。
你甚至可以有一個 function distance(...)
。 只要參數不同,它們就具有不同的類型,編譯器會計算出來。
另請注意,您不應使用using namespace std
,因為這也會激怒人類讀者。
在您更新的示例中,編譯器確實很困惑。 在這種情況下,您可以指定要使用distance
function,方法是將其更改為int num = std::distance(...);
好吧,一個是MyEngine::distance
,另一個是std::distance
。 他們是不同的名字。 這是scopes的全部內容。
如果您使用不合格的名稱distance
並讓編譯器找出它,那么只有一個問題,但如果這不起作用,那將是因為選擇的類型與您的用法不匹配,所以您的程序不會編譯。
如果您確實將內容放入std
中,那么名稱可能會以潛在的無法診斷的方式發生沖突,這可能導致崩潰,並且根據標准具有未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.