C++ Partial-specialization of class in source not header
C++ Partial-specialization of class in source not header
Foo.h
template<typename A, typename B>
class Foo{
public:
Foo();
/*..*/
};
Foo.cpp
template<typename A, typename B>
Foo<A, B>::Foo(){/*...*/}
template<typename A>
Foo<A, Beta>::Foo(){/* some specialized construction */} //<- this doesn't work.
template<>
Foo<Alpha, Beta>::Foo(){/*...*/} // <-will work, but I want partial specialization.
当我编译时,部分特化的构造函数抛出错误
nested name specifier 'Foo::' for declaration does not refer into a class, class template or class template partial specialization
我想我需要在某处声明此 partially-specialized class,但我不想让 re-declaring 保持不变 class ... 即我不想将以下内容放入 header 文件中:
template<typename A>
class Foo_Beta : public Foo<A, Beta>{
public:
Foo_Beta();
}
//in cpp
template<typename A>
Foo_Beta<A>() : Foo<A, Beta>() {/**specialized constructor stuff**/}
因为那时我无法构造使用 Foo_Beta 构造函数的 Foo()。
我试过了
template<typename A>
class Foo<A,Beta> : public Foo<A, Beta>{
public:
Foo();
}
但这也不编译。
本质上,在没有 re-declaring class 的所有内部函数的情况下声明 class 的偏特化的语法是什么?
你说:
template<typename A>
Foo<A, Beta>::Foo(){/* some specialized construction */} //<- this doesn't work.
只有你专门化了整个 class,你才能使用它。您不能只特化 class.
的一个成员函数
以下应该有效:
template<typename A> class Foo<A, Beta>
{
Foo();
};
template<typename A>
Foo<A, Beta>::Foo()
{
}
正如其他人所提到的 - 您不能部分特化一个函数。但是,您可以将模板函数中的工作推迟到专门的实现函数,这确实会产生部分专门化的效果,例如:
template<class X>
X make_a_B()
{
return X(); // default implementation
}
template<>
Beta make_a_B<Beta>()
{
Beta b;
// do custom things with b...
return b; // fully specialised for Beta, everything else uses default case.
}
template<class X>
X make_an_A()
{
return X();
}
template<typename A, typename B>
class Foo{
public:
Foo()
: _myA( make_an_A<A>() )
, _myB( make_a_B<B>() )
{}
/*..*/
A _myA;
B _myB;
};
Foo<Alpha, Beta>()
现在的行为与 Foo<Alpha, Gamma>()
不同
Foo.h
template<typename A, typename B>
class Foo{
public:
Foo();
/*..*/
};
Foo.cpp
template<typename A, typename B>
Foo<A, B>::Foo(){/*...*/}
template<typename A>
Foo<A, Beta>::Foo(){/* some specialized construction */} //<- this doesn't work.
template<>
Foo<Alpha, Beta>::Foo(){/*...*/} // <-will work, but I want partial specialization.
当我编译时,部分特化的构造函数抛出错误
nested name specifier 'Foo::' for declaration does not refer into a class, class template or class template partial specialization
我想我需要在某处声明此 partially-specialized class,但我不想让 re-declaring 保持不变 class ... 即我不想将以下内容放入 header 文件中:
template<typename A>
class Foo_Beta : public Foo<A, Beta>{
public:
Foo_Beta();
}
//in cpp
template<typename A>
Foo_Beta<A>() : Foo<A, Beta>() {/**specialized constructor stuff**/}
因为那时我无法构造使用 Foo_Beta 构造函数的 Foo()。
我试过了
template<typename A>
class Foo<A,Beta> : public Foo<A, Beta>{
public:
Foo();
}
但这也不编译。
本质上,在没有 re-declaring class 的所有内部函数的情况下声明 class 的偏特化的语法是什么?
你说:
template<typename A> Foo<A, Beta>::Foo(){/* some specialized construction */} //<- this doesn't work.
只有你专门化了整个 class,你才能使用它。您不能只特化 class.
的一个成员函数以下应该有效:
template<typename A> class Foo<A, Beta>
{
Foo();
};
template<typename A>
Foo<A, Beta>::Foo()
{
}
正如其他人所提到的 - 您不能部分特化一个函数。但是,您可以将模板函数中的工作推迟到专门的实现函数,这确实会产生部分专门化的效果,例如:
template<class X>
X make_a_B()
{
return X(); // default implementation
}
template<>
Beta make_a_B<Beta>()
{
Beta b;
// do custom things with b...
return b; // fully specialised for Beta, everything else uses default case.
}
template<class X>
X make_an_A()
{
return X();
}
template<typename A, typename B>
class Foo{
public:
Foo()
: _myA( make_an_A<A>() )
, _myB( make_a_B<B>() )
{}
/*..*/
A _myA;
B _myB;
};
Foo<Alpha, Beta>()
现在的行为与 Foo<Alpha, Gamma>()