這是我的背景:如何知道哪些函數重載GCC選擇
#include <string>
#include <map>
#include <sstream>
#include <iostream>
namespace na {
enum XXX { X1, X2 };
std::string to_string(XXX x) {
static const std::map<XXX, std::string> MAP { {X1, "X1"}, {X2, "X2"} };
return MAP.at(x);
}
}
namespace nb {
enum YYY { Y1 = 1001, Y2 = 1002 };
}
typedef char priority;
std::string to_string(priority p) {
std::ostringstream oss;
oss << p;
return oss.str();
}
int main()
{
na::XXX x = na::X1;
std::cout << "x: " << to_string(x) << "\n";
nb::YYY y = nb::Y2;
std::cout << "y: " << to_string(y) << "\n";
return 0;
}
的呼叫to_string(y)
是一個「錯誤」,因爲沒有功能to_string
存在類型nb::YYY
。但實際上這是有效的!
我編譯這個用:
g++ -o main.o -c -std=c++11 -Wall -Wextra -pedantic main.cpp
g++ -o function_overloading main.o
這編譯,沒有錯誤,沒有任何警告。在這種簡單的情況我知道,當GCC這個名字查找了to_string(y)
發現to_string(priority)
但在一個大項目,它不是簡單的找哪個功能GCC選擇了。
那麼,有沒有一種方法來確定哪些功能GCC選擇,「後天」,通過檢查的.o,或通過傳遞一個選項,GCC?
我在Linux上使用GCC 4.7.2。
用調試器來逐步完成它?一些IDE還可以設法找到實際使用的過載併爲代碼導航提供該信息。 – 2015-03-19 09:42:47
你可以通過將'priority'設置爲非整數類型來避免這種情況,例如'enum'。 – 2015-03-19 09:57:19
'std :: string na :: to_string(XXX x)'在main的範圍內是未知的,所以這將是顯而易見的。 – scones 2015-03-19 10:25:57