只是一個問題,我發現有趣的時候使用STL。在下面的代碼中,主函數中的最後兩行會導致錯誤(在註釋中指示)。但是,test_func編譯得很好。由於傳遞給模板函數的類型是引用類型,並且函數本身適用於這兩個操作符,所以這兩個操作符本質上不是相同的嗎?好吧,顯然不會導致其中一個編譯,而另一個不會。有人知道爲什麼C++嵌套引用直接vs通過模板參數
class File {
private:
std::string name_;
public:
File(std::string n) : name_(n) {}
std::string name() const { return name_; }
};
std::ostream& operator<<(std::ostream& os, const File& f)
{
os << f.name();
return os;
}
template <class T> void test_func(const T& v)
{
T& v1(v);
std::cout << "File:" << v1 << std::endl;
}
typedef File& FileRef;
int main(int argc, char* argv[])
{
File f("test_file");
test_func<File&>(f);
// FileRef& fRef1(f); ==> error; cannot declare reference to 'class File&'
// File&& fRef2(f); ==> error; expected unqualified-id before '&&' token
}
更新:我在處理bind1st和bind2nd函數時遇到了這個問題;它們在文本書中定義就像test_func一樣(第18章關於活頁夾的stroustrup),所以它不會出錯。
其即使我用 FileRef&fRef1 = F相同的錯誤; File && fREf2 = f; –