考慮代碼:錯誤時明確地將模板非類型參數
class Base{};
class Derived: public Base{};
template<Base& b> // references (and pointers) can be used as non-types
void f(){}
int main()
{
Derived d;
// f(d); // Error, template type must match exactly
f<(Base&)d>(); // Error here, why?!
}
我明白爲什麼評論調用失敗:模板類型必須完全匹配。但是我嘗試在第二個電話打石膏,並得到這個錯誤(gcc5.2):如果我做Derived d;
全球
error: 'd' is not a valid template argument for type 'Base&' because it is not an object with external linkage
同樣的錯誤。鏗鏘有點更有幫助,說
... note: candidate template ignored: invalid explicitly-specified argument for template parameter 'b'
我的問題是:是否代碼上面的法律或不?如果不是,有什麼理由爲什麼?
另請參閱http://stackoverflow.com/questions/5687540/non-type-template-parameters – DrWatson