テンプレートの特殊化をどのように行うべきかを理解するのに苦労しています。今回は、残念ながら、グーグルとSOは私を助けることができませんでした。
基本クラスの場合:
class base
{
public:
virtual ~base() = 0;
virtual int getInt() { throw std::invalid_argument(std::string(typeid(*this).name()) + " can't return int"); }
};
base::~base() {}
および派生クラス:
template<class T>
class derived : public base
{
public:
derived() {}
derived(T value) { mValue = value; }
private:
T mValue;
};
このコード:
void proof(base* arg)
{
try
{
std::cout << arg->getInt();
}
catch (std::exception& e)
{
std::cout << e.what();
}
std::cout << "\n\n";
}
int main()
{
base* a = new derived<int>(23);
base* b = new derived<std::string>("abc");
proof(a);
proof(b);
delete a;
delete b;
return 0;
}
まだ明らかでない場合の出力:
class derived<int> can't return int
class derived<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > can't return int
getInt()がmValueを返すように、派生の特殊化をどのように行う必要がありますか?何かのようなもの:
template<>
int derived<int>::getInt() { return mValue; }
これは機能していません。
より明確にするために、arg-> getInt()を呼び出すと、出力23を実行し、arg-> getInt()を呼び出すと、基本クラスで例外をスローすることを期待しています。サンプルコードを教えていただけますか?ありがとうございました。
derived
テンプレートはありませんgetInt()
方法を。存在しないものを専門にすることはできません。
テンプレート全体を特殊化する必要があります。これを試して:
template<>
class derived<int> : public base
{
public:
derived() {}
derived(int value) { mValue = value; }
int getInt() override { return mValue; }
private:
T mValue;
};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加