gpt4 book ai didi

c++ - 不能使用指针作为默认模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:13 25 4
gpt4 key购买 nike

我正在尝试使用默认原始指针作为默认模板参数。我读到非类型模板参数仅限于整数类型、枚举、指针和引用。对于引用,我没有遇到任何问题,但是当我尝试使用指针时,我遇到了这样的错误:

error: non-type template argument of type 'Engine *' is not a constant expression.

这是我的代码:

#include <iostream>
#include <memory>

using std::cout;
using std::endl;

class Engine
{
public:
void startEngine()
{
m_started = true;
cout << "Engine started!" << endl;
}
private:
bool m_started = false;
};

template<typename T, T* DEFAULT>
class Car
{
public:
explicit Car(const uint64_t uid) : m_uid(uid), engine(DEFAULT)
{
engine->startEngine();
}

private:
uint64_t m_uid;
T* engine;
};

namespace
{
std::shared_ptr<Engine> engine = std::make_shared<Engine>();
Engine* e = engine.get();
}

int main()
{
Car<Engine, e> lambo(0);
return 0;
}

我现在看到的唯一限制是第二个模板参数需要具有静态存储持续时间和外部或内部链接,但代码符合这些要求。感谢任何帮助。

最佳答案

非类型模板参数必须是常量表达式:

A template-argument for a non-type template-parameter shall be a converted constant expression (5.20) of the type of the template-parameter.


也许您可以解决此问题,使您指向的对象具有静态存储持续时间和链接(see):

For pointers to objects, the template arguments have to designate the address of a complete object with static storage duration and a linkage (either internal or external), or a constant expression that evaluates to the appropriate null pointer or std::nullptr_t value.

例子:

namespace{
Engine e;
}

int main(){
Car<Engine, &e> lambo(0);
return 0;
}

关于c++ - 不能使用指针作为默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807312/

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