小编jav*_*ver的帖子

通过typedef强制模板实例化:在g ++上成功,在Visual C ++上失败

我想强制模板实例化。
以下代码1在g ++(http://coliru.stacked-crooked.com/a/33986d0e0d320ad4)上可以正常工作(打印)。
但是,它0在Visual C ++(https://rextester.com/WGQG68063)上打印错误的结果()。

#include <iostream>
#include <string>
template <int& T>struct NonTypeParameter { };

//internal implementation
int lala=0;
template <typename T> struct Holder{
    static int init;
};
template <typename T> int Holder<T>::init = lala++;

//tool for user 
template <typename T> struct InitCRTP{ 
    using dummy=NonTypeParameter<Holder<T>::init>;
};

class WantInit : public InitCRTP<WantInit>{};//user register easily
int main(){
    std::cout << lala << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

是Visual C ++编译器错误还是一种未定义的行为?
如果它是Visual C ++错误,如何解决(同时仍保持美观)?

编辑:更改类->结构,建议使用Max Langhof(和很多人)。谢谢。

赏金原因 …

c++ g++ visual-c++ c++17 template-instantiation

11
推荐指数
2
解决办法
315
查看次数

Visual Studio 2015(C++):在第一个构建错误(不是第一个项目)上停止编译

如何在检测到编译错误时停止Visual Studio 2015的编译?

我的意思是第一个构建错误(可能是第一个.cpp),而不是第一个项目,因为它需要太多时间.
(我只有一个项目.)

名为" StopOnFirstBuildError "的扩展名不是答案,
因为它会在第一个出错的项目上停止.

(更详细)

当我按F5或时Ctrl+Shift+B,编译器将编译所有(或一些)文件.
在我的情况下,它只使用5秒就可以检测到一些错误,所以我希望它立即停止编译.
但是,VS 2015变得没有响应.
它也有很强的抵抗力Ctrl+Break.
我需要大约30秒才能导航到错误位置.
如何自动停止第一次编译错误的编译过程?

历史

一个旧的线程询问Visual Studio 2008这个.
它最常被接受的解决方案是去: -

Visual Studio -> Tools -> Macros -> Macro IDE...  (or ALT+F11)
Run Code Online (Sandbox Code Playgroud)

并粘贴一段代码.

但是,VS 2012中不再支持宏.
(我试图按Alt+F11VS 2015,没有宏编辑器/菜单出现.)

该声明与VS 2010的问题一致,表明上述技巧不起作用.

VS2010问题的解决方案是安装名为" CancelFailedBuild "的扩展.

因此,我下载了它.
执行时.vsix …

c++ visual-studio-2015

10
推荐指数
1
解决办法
849
查看次数

使std的数据结构默认使用我现有的非静态哈希函数"hashCode()"

我有一个中等大小的代码库(> 200 .cpp),它使用一个函数hashCode()来返回哈希值: -

class B01{  //a class
    //..... complex thing ....
    public: size_t hashCode(){ /* hash algorithm #H01 */}  
};
class B02{  //just another unrelated class
    //..... complex thing ....
    public: size_t hashCode(){/* #H02 */}  //This is the same name as above
};
Run Code Online (Sandbox Code Playgroud)

我已在各种位置使用它,例如在我的自定义数据结构中.它运作良好.

现在,我想让std::数据结构识别哈希算法: -

这是我应该做的: - (从cppreference修改,我将调用此代码#D).

//#D
namespace std {
    template<> struct hash<B01> {
        std::size_t operator()(const B01& b) const {
            /* hash algorithm #H01 */
        }
    }; …
Run Code Online (Sandbox Code Playgroud)

c++ hash templates sfinae c++11

10
推荐指数
4
解决办法
1243
查看次数

c ++中的非静态块

C++中是否存在非静态块?

如果不是,如何优雅地模仿它?

我想替换类似的东西: -

class C{
    public: void ini(){/* some code */}
};
class D{
    std::vector<C*> regis; //will ini(); later
    public: C field1; 
    public: C field2;  
    public: C field3;             //whenever I add a new field, I have to ... #1
    public: D(){
        regis.push_back(&field1);
        regis.push_back(&field2);
        regis.push_back(&field3); //#1 ... also add a line here
    }
    public: void ini(){
        for(auto ele:regis){
            ele->ini();
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

与: -

class D{
    std::vector<C*> regis;                        
    public: C field1;{regis.push_back(&field1);}//less error-prone (because it is on-site)
    public: C field2;{regis.push_back(&field2);}
    public: …
Run Code Online (Sandbox Code Playgroud)

c++ initialization non-static c++14

9
推荐指数
1
解决办法
523
查看次数

默认模板参数 - 不必从右边?为什么会这样?

默认模板参数是否可以以不从右开始的方式使用"默认值"?

标准是什么?
编译器将如何解释?

例如,我很惊讶这段代码有效.

#include <iostream>
using namespace std;

template <bool T=true, class U>   //"default" from LEFT-most parameter
void f(U u){
    if(T){ cout<<true;}
    else cout<<false;
}
int main() {
    auto x = []( ){  };
    f(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这里查看现场演示:https://ideone.com/l6d9du

c++ templates default-parameters

8
推荐指数
2
解决办法
723
查看次数

如何在C++中伪造"类的可见性"(而不是函数)?

没有功能,控制能见度C级的/无障碍++.

有没有办法伪造它?
是否有任何可以模拟最接近行为的C++宏/模板/魔术?

情况就是这样

Util.h (图书馆)

class Util{   
    //note: by design, this Util is useful only for B and C
    //Other classes should not even see "Util"
    public: static void calculate(); //implementation in Util.cpp
};
Run Code Online (Sandbox Code Playgroud)

Bh (图书馆)

#include "Util.h"
class B{ /* ... complex thing */  };
Run Code Online (Sandbox Code Playgroud)

Ch (图书馆)

#include "Util.h"
class C{ /* ... complex thing */  };
Run Code Online (Sandbox Code Playgroud)

Dh (用户)

#include "B.h"    //<--- Purpose of #include is to access "B", but not "Util"
class D{ 
    public: static …
Run Code Online (Sandbox Code Playgroud)

c++ class-visibility visual-studio-2015

8
推荐指数
2
解决办法
283
查看次数

将过滤器中的所有.cpp和.h移动到另一个项目并更正其文件夹位置

这是解决方案资源管理器中显示的Visual Studio中我的项目的过滤: -

ProjectName1
== References, External Dependencies, Header Files, Resource Files
== Source Files
==== myFilter01
------ K.h               (system folder = `D:\ProjectName1\K.h`)
------ K.cpp             (system folder = `D:\ProjectName1\K.cpp`)   
==== myFilter02                                                 
====== subFilter2_1                                              
--------- B.h            (system folder = `D:\ProjectName1\B.h`)
--------- B.cpp          (system folder = `D:\ProjectName1\B.cpp`)   
========= subFilter2_2                                           
----------- C.h          (system folder = `D:\ProjectName1\C.h`)   
----------- C.cpp        (system folder = `D:\ProjectName1\C.cpp`)   
ProjectName2                                                   
== ... (some existing filter/files)    
Run Code Online (Sandbox Code Playgroud)

(在实际情况中,所有过滤器都包含许多子过滤器和文件.)

如何 :

  • 将所有.h.cpp文件(B …

c++ visual-studio

8
推荐指数
1
解决办法
416
查看次数

在Visual Studio中对齐一组行的代码语句(类型,变量,等号等)

Visual Studio是否具有Microsoft Word中的选项卡自定义功能?
它对于一些脏重构(例如块编辑)也很有用.

有了这个功能,我不再需要space space space/ tab tab tab手动使其非常像: -

在此输入图像描述

在Microsoft Words中,我可以指定选定的行以使用标签的自定义位置: -

在此输入图像描述

它的工作方式如下(->是制表符): -

在此输入图像描述

编辑

VTT解决方案推荐的代码对齐扩展不适用于此代码: -

std::vector<int> cat =std::vector<int>() ;
float zombie=5;
Run Code Online (Sandbox Code Playgroud)

我希望它的格式如下: -

std::vector<int> cat    = std::vector<int>() ;
float            zombie = 5;
Run Code Online (Sandbox Code Playgroud)

但这是结果(充其量): -

std::vector<int>     cat =std::vector<int>() ;
float zombie             =5;
Run Code Online (Sandbox Code Playgroud)

EDIT2

这是一个更类似于真实案例的例子: -

MyArray<ManagerAAC   >   packAAC =create  (userData);
MyArray<ManagerANC  >   packANC =createANC  ( userData);
MyArray<ManagerAIC  >   packAIC =createAIC  (userData );
MyArray< ManagerNDX<1>>   packNDX1=generate<1>(userData);
MyArray<ManagerNDX<2>>    packNDX2=generate<2>(userData);
MyArray<ManagerNDX<3>>    packNDX3=generate<3>  (userData); …
Run Code Online (Sandbox Code Playgroud)

c++ tabs visual-studio

8
推荐指数
2
解决办法
983
查看次数

在1个语句中将自定义函数作为模板参数传递

我成功地传递了一个函数作为参数.

// this is in a scope of a normal function
class DummyClass{
    public: static int dummyFunction(G& goo){
        return goo.doSomething (); //non-static function
        //Edit 3: it calculates hash value
    }
};
AMap<G,int,DummyClass::dummyFunction>map;
//... do some other thing
Run Code Online (Sandbox Code Playgroud)

那些Dummy降低了代码的可读性.

我可以用更简洁的方式打电话吗?

AMap<G,int,
    [](G&goo)->int{ return goo.doSomething (); }
>map;
Run Code Online (Sandbox Code Playgroud)

我试过,但编译说

expected compile-time constant expression
Run Code Online (Sandbox Code Playgroud)

看起来编译器认为lambda函数不是编译时常量,但我确信它的行为是.

我已阅读如何使用lambda表达式作为模板参数?,但没有解决方案可以提供1语句的方式.

如果我可以称之为,我会是理想的

AMap<G,int, G::doSomething >map; //note that G::doSomething is non-static
Run Code Online (Sandbox Code Playgroud)

编辑

这就是我宣布AMap的方式

template<class K,class T,int (* K_uniqueHash)(K&) >AMap {//<--- can be changed
    private: int getIndex(K& k){ …
Run Code Online (Sandbox Code Playgroud)

c++ templates readability function-pointers c++11

7
推荐指数
1
解决办法
239
查看次数

属性表(.prop):如何重构其文件名而不破坏VS项目?

如果我重命名属性表,则将更改属性表的文本.
但是,属性表的文件名不会更改.
如何自动更改文件名文本

首先,我创建foo工作表.
它将保存为foo.props.

在那之后,我觉得foo是不是一个合适的名称,所以我重新命名foo,以bar项目经理: -
(从左至右)

在此输入图像描述

但是,foo.props-file仍然存在,不会bar.props自动重命名: -

在此输入图像描述

因此,当我想添加bar到任何配置时,我的眼睛必须foo.props在系统文件夹中搜索.(实际上,我应该搜索bar.props.)

这很容易出错.
这种不一致让我很紧张.

我的解决方法

每当我重新命名它,我必须删除旧foo.props窗口资源管理器中手动,然后保存bar工作表作为一个新的bar.props手动.

但是,我的项目中的其他工作表参考将被打破.

我将不得不再次添加bar.props所有相关项目的所有相关配置,否则项目将无效(unloadable):找不到foo.props.

有没有更好的工作流程?它是什么?

c++ visual-studio

7
推荐指数
1
解决办法
216
查看次数