所以我有一个类想要实例化两个类中的一个。我在标题中声明它:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.hinttest.MainActivity"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#000000">
<android.support.v7.widget.AppCompatEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Title"
android:textColor="#000000"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="#000000">
<android.support.v7.widget.AppCompatEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Title"
android:textColor="#000000"/>
</android.support.design.widget.TextInputLayout>
</LinearLayout>
由于我不想将方法定义放在标题中,而是将它们放在实现文件中,然后执行显式特化。尽管可以使用模板一般性地定义template <class T>
class MyClass {
public:
bool DoSomethingGeneric();
bool DoSomethingTSpecific();
};
方法,但DoSomethingGeneric
需要两个单独的实现,一个用于我想要实例化的两个可能的类DoSomethingTSpecific
:
MyClass
现在,谜语我:我在哪里放置显式专业化?如果我将它放在我的模板定义之后(就像我通常使用纯泛型类的特化),clang说:
template <class T>
bool MyClass<T>::DoSomethingGeneric() {
// Generic code
}
template <>
bool MyClass<ClassA>::DoSomethingTSpecific() {
// ClassA-specific implementation
}
template <>
bool MyClass<ClassB>::DoSomethingTSpecific() {
// ClassB-specific implementation
}
此消息附带指向定义explicit specialization of 'MyClass<ClassA>' after instantiation
的行的指针。这是有道理的。我的理解是DoSomethingTSpecific
方法的显式特化被视为隐式特化。
同时,如果我在所有模板定义之后放置特化,我会看到:
DoSomethingTSpecific
这对我来说是个谜。
有什么想法?如何才能有明确的类级别专门化和显式方法专门化?
答案 0 :(得分:1)
来自C ++标准§14.7.3(5)明确专业化 (强调我的):
明确专门的类模板的成员是 以与普通类成员相同的方式定义,不使用
template<>
语法。
示例:
template <> // specialization for classA
class MyClass<ClassA> {
public:
bool DoSomethingTSpecific(); // must be declared here
};
// template<> is not used here
bool MyClass<ClassA>::DoSomethingTSpecific() {
// ClassA-specific implementation
}
演示: