標籤:

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是允許這麼做的,這是微軟私貨,如果你注重可移植性就不要依賴這個特性。

n4618

14.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& { bool value; };

}

class A {
public:
template &
using B = Impl::B&;
B& dvalue;
B& ivalue;
};

似乎這樣也行?(疑似編譯器擴展)

class A {
public:
template &
struct B { T value; };
template &
struct B& { bool value; };
B& dvalue;
B& ivalue;
};


除了在類之內用 partial specialization,然後傳 入一個dummy template argument 作為 workaround,就像最上面回答所說的第二種方法;我個人更喜歡另一個workaround,但是要小改一下 B 類,可能不滿足題主的要求:

namespace helper
{
template& struct B_impl
{
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& dvalue;
B& ivalue;
};

因為B_impl 在A之外,所以可以隨便partial 或 explicit specialization都可以:不用再搞 dummy argument,代碼也好讀一點。


推薦閱讀:

C++ 隱式類型轉換重載決議的具體優先順序是怎樣的?
GCC編譯的程序為什麼沒有正確調用拷貝構造函數?
C++中將一個成員函數定義為const的會有助於提高性能嗎?
C++ 整型提升的相關問題?
作為 C++ IDE,Qt Creator 的優勢在哪裡?

TAG:C | CC | 模板C |