1
在VC++ 2013(和2015年RC)的名稱模板的說法,我覺得這會導致編譯錯誤:一類的另一個命名空間
namespace namespace1
{
template<typename T>
class Bar
{};
}
namespace namespace2
{
template <unsigned Bar>
struct Foo
{
static const int value = (Bar < 1) ? 1 : 2;
};
}
錯誤:
error C2059: syntax error : ')'
: see reference to class template instantiation 'namespace2::Foo<Bar>' being compiled
error C2143: syntax error : missing ')' before ';'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2143: syntax error : missing ';' before ')'
error C2059: syntax error : ')'
error C2238: unexpected token(s) preceding ';'
fatal error C1201: unable to continue after syntax error in class template definition
如果我交換命名空間的順序,我不會收到錯誤。
爲什麼編譯器將Bar當作一個類型處理,當它不符合命名空間的限定時?
另外,如果我改變的值初始化到:
static const int value = (Bar > 1) ? 1 : 2;
我沒有得到一個錯誤要麼。
遇到這樣在編譯谷歌協議緩衝,在這個結構的定義:
// Compile-time equivalent of VarintSize32().
template <unsigned Value>
struct StaticVarintSize32 {
static const int value =
(Value < (1 << 7))
? 1
: (Value < (1 << 14))
? 2
: (Value < (1 << 21))
? 3
: (Value < (1 << 28))
? 4
: 5;
};
不會因所謂的價值模板類存在於我們自己的代碼庫命名空間編譯。我現在通過確保首先包含相關的Procotol緩衝區頭文件來解決它,但似乎這是一個編譯器錯誤?
當我無法真正改變協議緩衝區代碼或Value類時,是否有其他解決方法?
看起來像一個bug給我。 'Bar'類模板在使用'Bar'的地方不可見。作爲一種解決方法,您可以在'Bar'周圍添加一對額外的parens,如'static const int value =((Bar)<1)? 1:2;' –
如上所述,這是在協議緩衝區代碼,雖然我可以改變它,但我不認爲這是正確的修復。 – Chris