C++ 嵌套類類模板特化 error: explicit specialization?
在class A中需要實現一個類模板B來做一些輔助的事情,並且需要對類模板B進行特化,但特化的時候報explicit specialization錯誤。
編譯器g++ 4.9或更高
示例代碼為實際問題的化簡版本,需要解決對類模板B的特化問題,而不是修改甚至移除類模板。
/* 在這裡特化: error: B is not a class template
class A;
template&<&>
struct A::B&
{ bool value; }; */class A
{
public:
template&
struct B
{ T value; };/* 在這裡特化:error: explicit specialization in non-namespace scope
template&<&>
struct B&
{ bool value; };*/B&
dvalue;
B&ivalue; // B的B& 特化版本需要在class A 中使用
//...
};/* 在這裡特化: error: specialization of A::B&
after instantiation
template&<&>
struct A::B&
{ bool value; };*/
謝謝
特化需要在命名空間里做,所以你不能在類內直接特化一個類模板,你可以放到類外來做。
PS. VS2015是允許這麼做的,這是微軟私貨,如果你注重可移植性就不要依賴這個特性。n461814.7.3 (2) An explicit specialization shall be declared in a namespace enclosing the specialized template. An explicit specialization whose declarator-id or class-head-name is not qualified shall be declared in the nearest enclosing namespace of the template, or, if the namespace is inline (7.3.1), any namespace from its enclosing namespace set. Such a declaration may also be a definition. If the declaration is not a definition, the specialization may be defined later (7.3.1.2).
模板(全?)特化應該只能在命名空間內進行(也就是不能在class裡面特化),所以大概只能改成這樣:
namespace Impl {
template &
struct B { T value; };
template &<&>
struct B&
}
class A {
public:
template &
using B = Impl::B&
B&
B&
};
似乎這樣也行?(疑似編譯器擴展)
class A {
public:
template &
struct B { T value; };
template &
struct B&
B&
B&
};
除了在類之內用 partial specialization,然後傳 入一個dummy template argument 作為 workaround,就像最上面回答所說的第二種方法;我個人更喜歡另一個workaround,但是要小改一下 B 類,可能不滿足題主的要求:
namespace helper
{
template&
{
T value;
};
// Here you can specialize in whichever way you want.
template&<&> struct B_impl&
{
bool value;
};
}
class A
{
public:
// Delegate real work to B_impl.
template&
struct B: helper::B_impl&
{
// ...
};
private: 因為B_impl 在A之外,所以可以隨便partial 或 explicit specialization都可以:不用再搞 dummy argument,代碼也好讀一點。
B&
B&
};
推薦閱讀:
※C++ 隱式類型轉換重載決議的具體優先順序是怎樣的?
※GCC編譯的程序為什麼沒有正確調用拷貝構造函數?
※C++中將一個成員函數定義為const的會有助於提高性能嗎?
※C++ 整型提升的相關問題?
※作為 C++ IDE,Qt Creator 的優勢在哪裡?