[英]Different behavior between g++ and clang++ in nested classes
我注意到gcc
9.2.0 和clang++
9.0.1 之間的行為不同。 我的代碼如下
//header.hh
...
template <typename T>
class Outer {
...
public:
template <typename S>
class Inner;
...
};
template <typename T>
template <typename S>
class Inner {
...
Inner& func();
...
};
然后,由於函數func()
是在另一個文件中實現的
//implementation.cc
template <typename T>
template <typename S>
Outer<T>::Inner<S>& Outer<T>::Inner<S>::func() {
...
};
現在,如果我使用g++
編譯就可以了。 如果我使用clang++
我得到
src/implementation.cc:6:1: error: missing 'typename' prior to dependent type template name 'Outer<T>::Inner'
Outer<T>::Inner<S>& Outer<T>::Inner<S>::func() {
^
1 error generated.
但是,如果我遵循它的建議並使用
typename Outer<T>::Inner<S>& Outer<T>::Inner<S>::func()
我有另一個錯誤:
src/implementation.cc:6:21: error: use 'template' keyword to treat 'Inner' as
a dependent template name typename Outer<T>::Inner<S>& Outer<T>
::Inner<S>::func() {
現在它的建議似乎很奇怪。
正確的語法如下:
template <typename T>
template <typename S>
typename Outer<T>::template Inner<S> &Outer<T>::Inner<S>::func() {
...
}
您可以在此問題中找到此語法的完整解釋。
但是,更簡單且有效的語法是這樣的:
template <typename T>
template <typename S>
auto Outer<T>::Inner<S>::func() -> Inner& {
...
}
通過在上面的示例中使用尾隨返回類型語法,您可以利用名稱解析范圍在Outer<T>::Inner<S>
內這一事實,因此您可以使用Inner
的 注入類名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.