gpt4 book ai didi

c++ - 具有使用依赖类型的模板构造函数的专用模板类(从一般情况派生而来)

转载 作者:行者123 更新时间:2023-11-28 05:49:56 29 4
gpt4 key购买 nike

我需要使模板化类构造函数采用依赖类型(在模板化类类型上)。这工作正常,除非我有模板类的专门化,在这种情况下似乎找不到构造函数。如果我在专门的子类中重新实现构造函数,我似乎无法通过构造函数或直接初始化基类。

有没有办法在类之外保留这个相对狭窄的接口(interface)?

class T1 {};
class T2 {};

// KeyType
template <typename SELECT>
class KeyType {
};

// Declarations
template <typename SELECT = T1>
class TestTemplate {
protected:
TestTemplate() {}
KeyType<SELECT> k;
public:
TestTemplate(KeyType<SELECT> const &key) : k(key) {}
};

template <>
class TestTemplate<T2> : public TestTemplate<T1> {
};


int main() {

KeyType<T2> key;
TestTemplate<T2> foo(key);
return 0;
}

看了一会儿,我意识到问题是我不能随意转换 KeyType<T2>KeyType<T1>对于 TestTemplate<T1>基类。

g++ 给出:

g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'int main()':
main.cpp:27:29: error: no matching function for call to 'TestTemplate<T2>::TestTemplate(KeyType<T2>&)'
TestTemplate<T2> foo(key);
^
main.cpp:20:7: note: candidate: TestTemplate<T2>::TestTemplate()
class TestTemplate<T2> : public TestTemplate<T1> {
^
main.cpp:20:7: note: candidate expects 0 arguments, 1 provided
main.cpp:20:7: note: candidate: constexpr TestTemplate<T2>::TestTemplate(const TestTemplate<T2>&)
main.cpp:20:7: note: no known conversion for argument 1 from 'KeyType<T2>' to 'const TestTemplate<T2>&'
main.cpp:20:7: note: candidate: constexpr TestTemplate<T2>::TestTemplate(TestTemplate<T2>&&)
main.cpp:20:7: note: no known conversion for argument 1 from 'KeyType<T2>' to 'TestTemplate<T2>&&'

最佳答案

构造函数在 C++ 中根本不被继承,所以你的实例 TestTemplate<T2>只有隐式声明的构造函数(默认,复制和移动它似乎由您发布的错误消息)。如果您假设,当您专门化一个模板时,专门化的模板从被专门化的模板继承声明和定义:情况并非如此。您必须再次在您的专用模板中重新声明和重新定义所有成员。

所以在你的情况下,你必须像这样将适当的构造函数添加到你的专用模板中:

template <>
class TestTemplate<T2> : public TestTemplate<T1> {
public:
TestTemplate<KeyType<T2> const &key) :
TestTemplate<T1>(...) {}
};

自基类以来,TestTemplate<T1> , 不提供默认构造函数,您必须调用该构造函数,但是,不清楚您想将什么作为关键参数传递给它,因为您有一个对 KeyType<T2> 的实例的引用。而不是 KeyType<T1> .

如果您确实希望从 TestTemplate<T1> 继承构造函数, 你可以用 using 来做到这一点指令,假设您使用的是 C++11:

template <>
class TestTemplate<T2> : public TestTemplate<T1> {
public:
using TestTemplate<T1>::TestTemplate;
};

但不可否认,我并不是 100% 了解这里的语法。

关于c++ - 具有使用依赖类型的模板构造函数的专用模板类(从一般情况派生而来),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35462959/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com