[英]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);
^~~
然后,我有三個問題。
template<int N> foo
嗎?foo
被發現而foo<1>
沒有?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.