簡體   English   中英

友元函數模板查找

[英]friend function template lookup

根據標准,在類中聲明和定義的友元函數只能通過 ADL 找到。 所以,我認為下面的代碼應該可以編譯。

template<int M>
struct test{
    template<int N = 0>
    friend void foo(test){}
};

int main(){
    test<2> t;
    foo(t);// compile
    foo<1>(t);// error
}

但是,gcc 給出了以下錯誤:

main.cpp: In function 'int main()':

main.cpp:10:5: error: 'foo' was not declared in this scope

     foo<1>(t);

     ^~~

然后,我有三個問題。

  1. 應該根據標准找到template<int N> foo嗎?
  2. 為什么foo被發現而foo<1>沒有?
  3. 除了在外面定義foo之外還有其他解決方法嗎?

https://en.cppreference.com/w/cpp/language/adl

雖然通過ADL可以解決函數調用即使普通查找什么也沒找到,但是對帶有顯式指定模板參數的函數模板的函數調用需要有普通查找找到的模板的聲明(否則就是語法錯誤遇到未知名稱后跟小於字符)(直到 C++20)

在 C++20 模式下,您的代碼編譯良好,演示: https : //gcc.godbolt.org/z/svdfW9drf

暫無
暫無

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

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